我正在使用 DES_ecb_encrypt 加密Cookie,之后我正在解密相同的值,我希望找到相同的值。
我正在使用这些功能:
void algo_crypt(request_rec *r) {
char cookie[] = "VAR=USER123456";
unsigned char key_md5[16];
int len;
const_DES_cblock *input;
DES_cblock *output;
unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE];
unsigned char *e = out;
DES_cblock key = "MyKey";
DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10};
DES_key_schedule keysched;
memset(in, 0, sizeof(in));
memset(out, 0, sizeof(out));
memset(back, 0, sizeof(back));
DES_set_key((C_Block *)key, &keysched);
strcpy(in, cookie);
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Plaintext: [%s]\n", in);
DES_ecb_encrypt((C_Block *)cookie,(C_Block *)out, &keysched, DES_ENCRYPT);
am_cookie_set(r, out);
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Ciphertext out: %s", out);
while (*e)
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
"algo_crypt [%02x] ", *e++);
}
这用于解密:
void algo_decrypt(request_rec *r) {
unsigned char key_md5[16];
int len;
const_DES_cblock *input;
DES_cblock *output;
unsigned char in[BUFSIZE], back[BUFSIZE];
unsigned char out[] = {0xb8, 0xa8, 0xb0, 0x54, 0x40, 0x23, 0xd1, 0x25};
unsigned char *e = out;
DES_cblock key = "MyKey";
DES_key_schedule keysched;
memset(back, 0, sizeof(back));
DES_set_key((C_Block *)key, &keysched);
char *mycookie = am_cookie_get(r);
DES_ecb_encrypt((C_Block *)mycookie, (C_Block *)back, &keysched, DES_DECRYPT);
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Decrypted Text: [%s]\n", back);
}
但是打印返回:
Decrypted Text: [VAR=USER]\n
我做错了什么?
我正在使用openssl,C和我正在使用ubuntu
开发Apache答案 0 :(得分:2)
我看到两个未使用的key_md5
个变量。您可能需要在“密钥”输入上执行MD5哈希,这实际上是密码,而不是密钥。
现在的问题是DES需要一个56位密钥,以8字节(每字节1位奇偶校验)编码。但是,您的“密钥”由5个字符/字节组成。所以三个字节是未知的。如您所见,C函数不包含长度参数,并且它不知道数组的大小(因为它只是一个指针)。
因此它需要5个字符和3个字节。因为那些可能有任何价值,你将得到一个不确定的结果。当然,无论如何,由于分组密码的输出看起来是随机的,所以不可能检测到这种情况。但是,除非你非常“幸运”,并且在加密和解密的"MyKey"
字符串后面都有相同的值,否则它仍会在解密时失败。