我在C中找到了很多AES,Twofish和Serpent的实现,但我并不真正理解这些例子。我只知道有些地方提供了求逆矩阵的例子。
有人能给我举一个用char*和密码加密/解密数据的示例或.c文件吗?
发布于 2011-01-14 20:52:34
维基百科的文章实际上链接到了一个用C编写的优秀的tutorial (由X-N20编写),它引导您完成数学运算,并提供随时随地的C实现,这对于理解该过程非常有用。我也推荐阅读finite field arithmetic上的内容。
Serpent和Twofish错过了AES的称号,在互联网上并没有很好的记录。但请记住,每种方法都提供了参考实现。
实际上,自己实现它们需要研究他们各自的论文,可能还需要参考源代码。
请注意,您的200亿条评论都与以下事实有关:为AES指定的接口NIST是每个密码提供128位(16字节)输入块以及128位、192位和256位密钥块之一。
为了以这样一种方式安全地加密,以便正确地抵抗密码分析,您需要进行一些仔细的工作。例如,如果您的最后一个块缺少所需的几个字节怎么办?如何安全地填充?同样,根据预期的用途,还有其他方案,特别是对于大型重复数据,设计用于抵抗密码分析,在这种情况下,您知道加密数据可能包含c:\windows的内容。评论员们试图得到的是,对于任何现实世界的使用,为了保持安全,这些事情都需要考虑。
编辑由于出现了另一个关于此主题的问题,以下是几个链接:
各种密码算法的
crypto.gpg提供了一整套加密函数。具体来说,如果你想要AES,你可能在这里找不到,但你会找到山茶花和蛇。发布于 2015-08-27 03:31:02
为了回答killercode这个-still未回答的问题,这里是我尝试实现同样的事情:
int mode = MODE_CBC;int keySize = 256;int result = 0;keyInstance ki;/*密钥信息,包括表*/ cipherInstance ci;/*保持模式(ECB,CBC)和IV */字节plainTextMAX_BLK_CNT*(BLOCK_SIZE / 8);// 64大小!字节cipherTextMAX_BLK_CNT*(BLOCK_SIZE / 8);字节decryptOutMAX_BLK_CNT*(BLOCK_SIZE / 8);字节ivBLOCK_SIZE / 8;int i;选择要加密的字节数(块的倍数) */ /*,例如byteCnt = 16,32,48,64 */ byteCnt= (BLOCK_SIZE / 8) * (1 + (rand() % MAX_BLK_CNT));/*生成测试数据*/;int plainTextLength = 65;for (i = 0;I< min (plainTextLength,MAX_BLK_CNT*(BLOCK_SIZE / 8));i++) plainTexti = (BYTE)rand();if (plainTextLength> MAX_BLK_CNT * BLOCK_SIZE / 8) { ::MessageBox(NULL,_T(“您需要增加明文的错误以适应一次调用。”),_T("Error"),MB_OK);return;} int byteCnt = ceil((double)plainTextLength / (BLOCK_SIZE / 8.0)) * (BLOCK_SIZE / 8);结果- */ 128位密钥的/*‘虚拟’设置*/ if (makeKey(&ki,DIR_ENCRYPT,keySize,NULL) != TRUE) /* = 1;/* - */ /*‘虚拟’密码设置*/ if (cipherInit(&ci,模式,NULL) != TRUE) result = 1;/*选择密钥位*/ for (i = 0;i< keySize / 32;i++) ki.key32i = 0x10003 * rand();/*运行密钥调度*/ reKey(&ki);/*设置随机IV (如果需要) */ if (模式!= MODE_ECB) { for (i = 0;i< sizeof( iv );i++) ivi =(字节)rand();/*将iv复制到ci */ memcpy(ci.iv32,iv,sizeof(ci.iv32));} /*加密字节*/ if (blockEncrypt(&ci,&ki,plainText,byteCnt * 8,cipherText) != byteCnt * 8) result = 1;/* - */ /*解密字节*/ if (模式!= MODE_ECB) /*首先重新初始化IV (如果需要) */ memcpy(ci.iv32,iv,sizeof(ci.iv32));if (blockDecrypt(&ci,&ki,cipherText,byteCnt * 8,decryptOut) != byteCnt * 8) result = 1;/*确保解密输出与原始明文匹配*/ if (memcmp( plaintext,decryptOut,byteCnt)) result = 1;if (result == 0) ::MessageBox(NULL,_T("SUCCESS"),_T("Success"),MB_OK);
这是我的尝试,看起来效果很好。
它正在使用CBC模式。
如果任何人有任何建议,我都乐于接受。
当然,您可能希望将MAX_BLK_CNT设置为变量并相应地增加它,以便能够加密各种数据长度。尽管我不能100%确定这是否是它的正常使用。
干杯!:)
发布于 2011-01-14 16:44:24
下载OpenSSL/Putty/GnuPG源代码。它们都包含了相应的加密算法的源代码。此外,每个算法都有C语言的参考实现,可以很容易地在互联网上找到这些实现。
https://stackoverflow.com/questions/4688512
复制相似问题