加密
email:[email protected] 画笔
加密技术需要提供两个特性:
- 1数据可恢复性,也就是加密后的密文中数据不丢失,能单个或整体对应到明文。
- 2正向加密快,反向加密时间非常之长,几乎没有可能。
关于第一条,在数学运算中,加、减、乘、除,都会造成数据的溢出(数据丢失),当然你可以有原文密文不等长也可以(这种方式,主要在非对称加密里面使用)。对称加密,使用 ^ 异或,异或不会造成数据溢出。
关于第二条,需要用到迭代来破坏可统计性,使黑客不可能通过大量数据的对比分析,来找到密钥,因为每个数据对应的密钥都是可变的。
例如给你一个字符串"01234",密文是"23456",很明加密算法是+2。
如果给你一个字符串"01234",密文是"08717",加密算法就很难一下猜出。假设迭代的结果是"08717"。
核心逻辑算法:
A ^ B = C
C ^ B = A。其中 A是明文,B是密钥,C是密文。
例如:
0xFF00 ^ 0xFFFF = 0x00FF
0x00FF ^ 0xFFFF = 0xFF00
下面是伪代码,临时演示用一下,现在有大量的加密算法,不需要我再写一个多余的加密算法。
#include <iostream>
#include <openssl/sha.h>
using namespace std;
#define KEY "0123456789"
#define MAGIC1 0xffeeddccaa002266
#define MAGIC2 0x789364e5c6a4dde1
int get_key(const char *str)
{
int key=0;
SHA256_CTX OBJ;
SHA256_Init(&OBJ);
SHA256_Update(&OBJ, str, strlen(str));
SHA256_Final(&key, &OBJ);
}
int encryption(void *dat, int len, void *buf)
{
int temp;
int key = get_key(KEY);
int a=len/sizeof(int), b=len%sizeof(int);
for (int i=0; i<a; i++) {
temp = key ^ ( *((unsigned int *)dat + i) );
*((int *)buf + i) = temp;
key ^= temp; //密钥迭代
key ^= MAGIC1;
key ^= MAGIC2;
}
for (int j=b, j<sizeof(int); j++) {
*((unisgned char *)buf + 4 * i + j) = 0x00;
}
*((int *)buf + i) ^= key;
}
int decryption(void *dat, int len, void *buf)
{
}
补充一下:关于标准的加密算法,密文的格式应该在头中加入TLV。