简单的加密解密算法
2015-08-21 20:27
716 查看
本文描述一种项目中采用的简单加密解密算法,通过把多种算法进行组合。特点是同个字符串不同时间加密结果不同,混合了多种加密方式,很难用统计的方式对密文进行破解。
项目中仅是对密码进行加密,规定密码长度不超过16个字符,故以下的算法均是固定长度的。
1)扩展字符串
在加密字符串末加"\0",之后添加随机字符串扩展为32个字节。以系统时间为种子产生随机字符串,确保了同个字符串不同时间加密的结果均不同。
2)字符串移位
整个字符串的二进制位依次后移n*8+4位,此操作打乱了字符串的统计特性。
[cpp] view
plaincopy
int n=4;
int i;
char temp
;
for(i=0;i<N;i++)temp[i]=str[i];
for(i=0;i<N;i++)str[i]=((temp[(i+n)%N]<<4)&0xF0)|((temp[(i+n+1)%N]>>4)&0x0F);
3)单字符替换
本操作是把每个字符替换为另一字符,采用算法是把字符的前后4位对调。
[cpp] view
plaincopy
str[i]=((str[i]<<4)&0xF0)|((str[i]>>4)&0x0F);
4)加入密钥进行异或,密钥字符串自定义
5)整个字符串循环移位,原理同2)但操作单位为字符而不是二进制位
以上2)~5)前后顺序可调换,解密过程与加密过程相反。
若需对任意长字符串加密,只需第16字符分别加密然后进行拼接即可。如果需要将密文转换为可见字符进行传输,可对密文进行base64编码。
项目中仅是对密码进行加密,规定密码长度不超过16个字符,故以下的算法均是固定长度的。
1)扩展字符串
在加密字符串末加"\0",之后添加随机字符串扩展为32个字节。以系统时间为种子产生随机字符串,确保了同个字符串不同时间加密的结果均不同。
2)字符串移位
整个字符串的二进制位依次后移n*8+4位,此操作打乱了字符串的统计特性。
[cpp] view
plaincopy
int n=4;
int i;
char temp
;
for(i=0;i<N;i++)temp[i]=str[i];
for(i=0;i<N;i++)str[i]=((temp[(i+n)%N]<<4)&0xF0)|((temp[(i+n+1)%N]>>4)&0x0F);
3)单字符替换
本操作是把每个字符替换为另一字符,采用算法是把字符的前后4位对调。
[cpp] view
plaincopy
str[i]=((str[i]<<4)&0xF0)|((str[i]>>4)&0x0F);
4)加入密钥进行异或,密钥字符串自定义
5)整个字符串循环移位,原理同2)但操作单位为字符而不是二进制位
以上2)~5)前后顺序可调换,解密过程与加密过程相反。
若需对任意长字符串加密,只需第16字符分别加密然后进行拼接即可。如果需要将密文转换为可见字符进行传输,可对密文进行base64编码。
相关文章推荐
- Sliding Window Maximum
- Proxy 时空隧道
- LightOJ1317---Throwing Balls into the Baskets 解题心得
- iOS开发——多线程篇——RunLoop
- 深入理解JavaScript系列(38):设计模式之职责链模式
- 可视化交互技术
- C语言产生随机字符串
- jenkins 构建配置
- BZOJ1051
- 分页控件
- Rnadom Teams
- Hadoop的web页面....简单翻译一下,熟悉熟悉
- redis-3.0.3配置参考
- Shell重定向&>file、2>&1、1>&2的区别
- hdu1019
- leetcode-124:Binary Tree Maximum Path Sum(Java)
- 文本输入控件
- Action、Action<T>、Func<T> 匿名函数的写法
- linux使用酷我在线听音乐
- leetcode-124:Binary Tree Maximum Path Sum(Java)