Android面试题-Java安全专题一

Android程序员面试宝典

安全专题

1.1 手写简单的加密(凯撒密码)

1.1.1 介绍

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,由此可见,位数就是凯撒密码加密和解密的密钥。

例如:字符串”ABC”的每个字符都右移3位则变成”DEF”,解密的时候”DEF”的每个字符左移3位即能还原,如下图所示:

《Android面试题-Java安全专题一》

1.1.2 准备知识

//字符转换成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'

《Android面试题-Java安全专题一》

1.1.3 凯撒密码的简单代码实现

/**
 * 加密
* @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);
}

代码输出结果:

《Android面试题-Java安全专题一》

1.1.4 破解凯撒密码:频率分析法

凯撒密码加密强度太低,只需要用频度分析法即可破解。
在任何一种书面语言中,不同的字母或字母组合出现的频率各不相同。而且,对于以这种语言书写的任意一段文本,都具有大致相同的特征字母分布。比如,在英语中,字母E出现的频率很高,而X则出现得较少。

英语文本中典型的字母分布情况如下图所示:

《Android面试题-Java安全专题一》

1.1.5 破解流程

1,统计密文里出现次数最多的字符,例如出现次数最多的字符是是’h’。
2,计算字符’h’到’e’的偏移量,值为3,则表示原文偏移了3个位置。
3,将密文所有字符恢复偏移3个位置。

注意点:统计密文里出现次数最多的字符时,需多统计几个备选,因为最多的可能是空格或者其他字符,例如下图出现次数最多的字符’#’是空格加密后的字符,’h’才是’e’偏移后的值。

《Android面试题-Java安全专题一》

解密时要多几次尝试,因为不一定出现次数最多的字符就是我们想要的目标字符,如下图,第二次解密的结果才是正确的。

《Android面试题-Java安全专题一》

  • 欢迎关注微信公众号、长期为您推荐优秀博文、开源项目、视频

  • 微信公众号名称:Android干货程序员

  • 《Android面试题-Java安全专题一》
    原文作者:马伟奇
    原文地址: https://www.jianshu.com/p/1433d21a6bc7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞