软件中的加密算法


软件中的加密算法

文章插图
 
这个虽然是闲扯淡的,但是看的时候请抓牢:
  • 我们一切以业务方案为目的,
  • 一些关键名词和概念还是很认真 。
加密签名一个故事
这是从别人那边听来的故事,作为安全知识的入门非常有意义 。
  1. 一个国王英年早逝,留下年幼的王子,国王的弟弟就做了摄政王 。
  2. 王子快18岁的时候,他叔叔派他做信使,给另外一个国王送信,还让侍卫长跟着 。
  3. 王子晚上趁着侍卫长睡着了,偷偷打开信件,看见里面的内容是: 请您杀了这个信使 。
  4. 王子于是把信件修改了一下:请把您的女儿嫁给信使 。
  5. 王子然后做了那个国家的驸马 。过几年后,岳父也死了,他就做了国王,带兵杀回去报仇 。
叔叔的反思和改进暂时不讨论善恶,我们站在叔叔的立场上,看他哪些事情没做好?
  • 数据的隐秘:他的信件内容被别人看到了 。
  • 数据的篡改:他的邮件被人冒充了 。
所以从技术层面上,我们可以给他一个有效建议,跟别的国王约定:
  • 针对第一个情况:他写的信,每个字母向后偏移10个位置——数据被加密了
  • 针对第二个情况:商量了一个算式,每个信件,把全部字母的数字加起来,通过这个算式算出来一个新的数字,写在信件最后,这样除了他俩,没谁能伪造信——数据被签名了
PKI里的加密和签名在事实上,信息传输的物理通道是不安全的,【信使】作为信息的传递人,可以轻易的偷窥别人的信息,甚至“代表”别人发言 。老外的思路是认可这个现状,然后从数理逻辑上来应对这个问题 。
Public Key Infrastructure,公开密钥体系,就是针对这个情况的 。 
这个体系的特点是,算法思路和实现都可以是公开的,只要保证Key的安全就可以 。
【软件中的加密算法】这个章节里面,我们只要讲到加密和签名就可以了 。
加密
加密根据密钥可以粗略的分俩类
对称加密
对称加密,就是加密和解密的过程里面,用的key都是一个——我们称为SecretKey 。
  • AES:一般记得这个就可以了,因为现在好像也就它是最好用的
  • DES、3Des:我经常在代码里面能看见的 。
  • 其它
业务跟进:在前面我们给王叔的建议,很明显是一个比较土的对称加密方案 。
非对称加密
非对称加密,加密和解密的密钥不同,用于加密的称为公钥(PublicKey),用于解密的称为私钥(PrivateKey) 。
业务跟进:我们的建议,国王们各自有一套公钥+私钥,私钥自己保留好,公钥发布给大家 。谁想给某人写信了,就用这个人的公钥加密,信件半路上被人截胡了,也无法解密内容 。
  • RSA:最出名的,在以前非对称加密就是区分为RSA和其它,
  • ECC:当前最牛的规范,rsa也变成其它了
  • 其它:
对称和非对称的优劣对比
  • 对称加密在技术上有优势,同样的安全级别下,加密解密的速度快很多
  • 对称加密同时也兼具签名功能
  • 但是在多用户业务场景,有无法解决的问题:
  • 俩个人玩,一套SecretKey就够了
  • 三个人玩,3套
  • 四个人玩,12套,
  • …… N的组合数量 。
  • 结论:后面讨论各自适合场景 。
签名和验签业务跟进:我们的建议,国王们各自有一套自己的公钥+私钥,私钥自己保留好,公钥发布给大家 。谁想发邮件,用私钥对内容进行“签名”,签名的结果写在信封上;收到邮件的人,用【发件人的公钥】+【内容】+【签名】进行验签,以确保这个邮件就是那个国王发的
JAVA伪码表示如下
  • 签名:byte[] sign(byte[] content, PrivateKey prvKey)
  • 验签:boolean verify(byte[] result, byte[] content, PublicKey pubKey)
小结其实对称加密可以忽略,我们就记得非对称加密和签名比较重要
  • 私钥放在自己手里,用来解密和签名,这俩个事情都明显是个人的私密行为,因此私钥
  • 公钥发布出去,用来加密和验签,这俩个事情明显是个人对外的公开行为,因此公钥
我们的“完美”方案到这里,我们就可以给王叔和其他的国王们一个比较完美的RSA方案