文件加密(一) 凯撒加密(Caesar cipher)
2015-08-12 00:20
323 查看
算法一 : 凯撒加密 (只能对英文的txt) 将每个字符的ASCII码相对于设置的偏移量偏移
语文学的不好,算法原理就百度copy一下。
在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
重点解释一下代码中的
如果加密字符的ASCII码值加上偏移量的值大于z的话,只需要将该值减去26。
为什么要减去26?
可以这么理解,如果我们要加密字符x,偏移量为3,x的ASCII码值等于120,加密后为123对应的是符号{ ,加密后的字符不是字母,不便于使用。
因此我们将其减去26等于97,对应字符a,我们把a到z看作一个周期的话,x向后偏移3最终得到的就是字符a。
此处的n为回车的数目,记录回车的数目,最后写入文件要减去回车的数目。
我们先把它在代码中注释掉,也就是不减去回车数目n。
测试1为源文件,测试2为加密后的文件。
源文件中只有ab回车c,回车对应的两个字符 \n\r,那么源文件中内存排布就是 ab\n\rc 五个字符,当编译器读入源文件时会自动忽略掉\r,也就变成了 ab\nc 四个字符,nFIleLen = 5,在写入文件的时候实际上只有4个字符。所以写入的时候如果不把回车数减掉,那么就会出现这样的错误。写入fg\nh?
五个字符。
如果将回车数减掉的话,结果会变成这样。
结果正确。
#include <iostream> #include <fstream> using namespace std; int main() { ifstream iFile("D:\\测试1.txt"); //建立输入文件流对象 iFile.seekg(0, ios::end); int nFileLen = iFile.tellg(); iFile.seekg(0, ios::beg); char *str = new char[nFileLen + 1]; iFile.read(str, nFileLen); iFile.close(); str[nFileLen] = 0; int nCaesar = 5; //设置偏移量 int n = 0; //记录回车数目 for (int i = 0; i < nFileLen; i++) { if ((str[i] >= 'a') && (str[i] <= 'z')) { str[i] += nCaesar; if (str[i] > 'z') str[i] -= 26; } else if ((str[i] >= 'A') && (str[i] <= 'Z')) { str[i] += nCaesar; if (str[i] > 'Z') str[i] -= 26; } else if (str[i] == '\n') n++; } ofstream oFile("D:\\测试2.txt"); oFile.write(str, nFileLen - n); oFile.close(); delete[] str; str = nullptr; return 0; }
语文学的不好,算法原理就百度copy一下。
在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。恺撒密码还在现代的ROT13系统中被应用。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。
重点解释一下代码中的
<span style="white-space:pre"> </span>str[i] += nCaesar; if (str[i] > 'z') str[i] -= 26;
如果加密字符的ASCII码值加上偏移量的值大于z的话,只需要将该值减去26。
为什么要减去26?
可以这么理解,如果我们要加密字符x,偏移量为3,x的ASCII码值等于120,加密后为123对应的是符号{ ,加密后的字符不是字母,不便于使用。
因此我们将其减去26等于97,对应字符a,我们把a到z看作一个周期的话,x向后偏移3最终得到的就是字符a。
else if (str[i] == '\n') n++;
oFile.write(str, nFileLen);
此处的n为回车的数目,记录回车的数目,最后写入文件要减去回车的数目。
我们先把它在代码中注释掉,也就是不减去回车数目n。
测试1为源文件,测试2为加密后的文件。
源文件中只有ab回车c,回车对应的两个字符 \n\r,那么源文件中内存排布就是 ab\n\rc 五个字符,当编译器读入源文件时会自动忽略掉\r,也就变成了 ab\nc 四个字符,nFIleLen = 5,在写入文件的时候实际上只有4个字符。所以写入的时候如果不把回车数减掉,那么就会出现这样的错误。写入fg\nh?
五个字符。
oFile.write(str, nFileLen - n);
如果将回车数减掉的话,结果会变成这样。
结果正确。
相关文章推荐
- Root(hdu5777+扩展欧几里得+原根)
- 字符编码
- hdoj-1232 畅通工程【并查集】
- ListView item过多 造成视图超出界面 解决
- 为什么pyspider+mongodb只存了一部分数据到数据库,而其他大量数据并没有写入数据库!
- 使用phpStudy在Windows下搭建moodle测试学习环境
- Cookie详解
- hdu 4287 Intelligent IME
- Codeforces #315 DIV2
- 设计模式-创建型之抽象工厂模式
- 学生管理系统项目演示
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 希尔排序(简单)
- 关于DLL导出函数的总结
- codeforces 538 A Cutting Banner
- iOS项目开发实战——使用异步请求获取网页HTML源代码
- 2015-08-10-----2015-08-11
- hdoj 4309 Seikimatsu Occult Tonneru 【最大流 + 状压枚举二进制】
- 打电话,发短信,发邮件,app跳转
- globalCompositeOperation 学习