对称加密解密是怎么一回事情?

加密

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。
发布了61 篇原创文章 · 获赞 63 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/jacky128256/article/details/100294709