以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https 协议的安全通讯机制。最终才能在SSL 开发过程中得心应手。
另外,对称加密和消息摘要这两个知识点是可以单独拿来使用的。
数字证书使用到了以上学习的所有知识
- 对称加密与非对称加密结合使用实现了秘钥交换,之后通信双方使用该秘钥进行对称加密通信。
- 消息摘要与非对称加密实现了数字签名,根证书机构对目标证书进行签名,在校验的时候,根证书用公钥对其进行校验。若校验成功,则说明该证书是受信任的。
- Keytool 工具可以创建证书,之后交给根证书机构认证后直接使用自签名证书,还可以输出证书的RFC格式信息等。
- 数字签名技术实现了身份认证与数据完整性保证。
- 加密技术保证了数据的保密性,消息摘要算法保证了数据的完整性,对称加密的高效保证了数据处理的可靠性,数字签名技术保证了操作的不可否认性。
通过以上内容的学习,我们要能掌握以下知识点:
- 基础知识:bit 位、字节、字符、字符编码、进制转换、io
- 知道怎样在实际开发里怎样使用对称加密解决问题
- 知道对称加密、非对称加密、消息摘要、数字签名、数字证书是为了解决什么问题而出现的
- 了解SSL 通讯流程
- 实际开发里怎样请求Https 的接口
凯撒密码
1. 介绍
凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3 的时候,所有的字母A 将被替换成D,B 变成E,由此可见,位数就是凯撒密码加密和解密的密钥。
例如:字符串”ABC”的每个字符都右移3 位则变成”DEF”,解密的时候”DEF”的每个字符左移3 位即能还原,如下图所示:
2. 准备知识
1 2 3 4 5 6 7 |
//字符转换成ASCII 码数值 char charA = 'a'; int intA = charA; //char 强转为int 即得到对应的ASCII 码值,’a’的值为97 //ASCII 码值转成char int intA = 97;//97 对应的ASCII 码’a’ char charA = (char) intA; //int 值强转为char 即得到对应的ASCII 字符,即'a' |
3. 凯撒密码的简单代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/** * 加密 * @param input 数据源(需要加密的数据) * @param key 秘钥,即偏移量 * @return 返回加密后的数据 */ public static String encrypt(String input, int key) { //得到字符串里的每一个字符 char[] array = input.toCharArray(); for (int i = 0; i < array.length; ++i) { //字符转换成ASCII 码值 int ascii = array[i]; //字符偏移,例如a->b ascii = ascii + key; //ASCII 码值转换为char char newChar = (char) ascii; //替换原有字符 array[i] = newChar; //以上4 行代码可以简写为一行 //array[i] = (char) (array[i] + key); } //字符数组转换成String return new String(array); } /** * 解密 * @param input 数据源(被加密后的数据) * @param key 秘钥,即偏移量 * @return 返回解密后的数据 */ public static String decrypt(String input, int key) { //得到字符串里的每一个字符 char[] array = input.toCharArray(); for (int i = 0; i < array.length; ++i) { //字符转换成ASCII 码值 int ascii = array[i]; //恢复字符偏移,例如b->a ascii = ascii - key; //ASCII 码值转换为char char newChar = (char) ascii; //替换原有字符 array[i] = newChar; //以上4 行代码可以简写为一行 //array[i] = (char) (array[i] - key); } //字符数组转换成String return new String(array); } |
代码输出结果:
4. 破解凯撒密码:频率分析法
凯撒密码加密强度太低,只需要用频度分析法即可破解。
在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言书写的任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母E 出现的频率很高,而X 则出现得较少。
英语文本中典型的字母分布情况如下图所示:
5. 破解流程
- 统计密文里出现次数最多的字符,例如出现次数最多的字符是是’h’。
- 计算字符’h’到’e’的偏移量,值为3,则表示原文偏移了3 个位置。
- 将密文所有字符恢复偏移3 个位置。
注意点:统计密文里出现次数最多的字符时,需多统计几个备选,因为最多的可能是空格或者其他字符,例如下图出现次数最多的字符’#’是空格加密后的字符,’h’才是’e’偏移后的值。
解密时要多几次尝试,因为不一定出现次数最多的字符就是我们想要的目标字符,如下图,第二次解密的结果才是正确的。