当前位置:   article > 正文

C语言 AES加解密_c语言实现aes加密解密

c语言实现aes加密解密

                                          C语言 AES加解密

一、简述

       记--C语言实现的AES加解密。       

       示例代码打包:外链:https://wwm.lanzouq.com/b0camwuah 密码:7ios

二、AES简述

AES加密
名称 内容 备注
AES描述 AES属于对称加密,就是用一个密匙K将数据Data1加密得到Data2, 解密时需要密匙K对Data2解密还原为Data1。 对称加密算法也就是加密和解密用相同的密钥。
密匙长度

AES128是16字节,也就是128bit;

AES192是24字节,也就是192bit;

AES256是32字节,也就是256bit;

加密轮数

AES128是10轮;

AES192是12轮;

AES256是14轮;

根据给出的初始密匙再拓展出多个密匙。轮数多的安全性相对更高些。
明文分组

明文也就是要加密的数据,按16字节为一组进行分别加密,不够16字节的可进行数据填充。如果选择了填充方式,解密后需要将填充的数据剔除。

填充方式:

NoPadding:不填充,那就只能加密长度为16倍数的数据,一般不使用
Zeros:补0,如果原数据长度恰好是16的倍数,也要补16个0
ISO10126: 最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数

PKCS5(PKCS7):应用比较多,最后一组缺几个字节就填充几

PKCS7示例:

要加密的数据是0123456789abc共13个数据,再填充3个才够16个,PKCS7填充时会在后面填充3个3。

加密方式

电码本模式(Electronic Codebook Book (ECB)):将明文按16字节分组,每个明文使用同一个初始块向量,每组分别加密后拼接。

密码分组链接模式(Cipher Block Chaining (CBC)):因为ECB每个明文使用同一个初始化向量,所以明文内相同的明文分组,加密的密文也是相同的;针对这个问题就有了CBC模式,每一小段明文先与初始块向量或者上一段的密文段进行异或运算后,再与密钥进行加密;简单来说就是每一段的明文的初始块向量都是不一样的,这样明文内相同的明文分组,加密的密文也因此不同。

实际应用比较多的是ECB和CBC。

三、示例代码

main.c

  1. #include "aes.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h> //isprint
  5. /* 编译指令
  6. D:\R\Qt5.7\Tools\mingw530_32\bin\gcc.exe -fdiagnostics-color=always -g D:\VSCode\AES\main.c D:\VSCode\AES\aes.c -o D:\VSCode\AES\main.exe
  7. */
  8. void PrintData(const char *head, unsigned char *data, unsigned int len)
  9. {
  10. unsigned int i;
  11. printf("%s, len:%u:\r\n", head, len);
  12. //按16进制打印出来
  13. printf("HEX:[");
  14. for (i=0; i<len; i++) {
  15. printf("%02X ", data[i]);
  16. }
  17. printf("]\r\n");
  18. //按ASCII码打印出来
  19. printf("ASCII:[");
  20. for (i=0; i<len; i++) {
  21. if (isprint(data[i])) {//可打印字符
  22. printf("'%c' ", data[i]);
  23. } else {
  24. printf("\\%02X ", data[i]);
  25. }
  26. }
  27. printf("]\r\n");
  28. }
  29. int main(int argc, char *argv[])
  30. {
  31. unsigned int len;
  32. //秘钥,根据实际情况自己定义,AES128 用16字节、AES192 用24字节、AES256 用32字节
  33. unsigned char key[32] = {
  34. 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x41,0x42,0x43,0x44,0x45,0x46,
  35. 0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x41,0x42,0x43,0x44,0x45,0x46
  36. };
  37. //初始化向量, 固定长度16个, 当mode=AES_MODE_CBC时用到
  38. unsigned char IV[4*Nb] = {0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x30,0x41,0x42,0x43,0x44,0x45,0x46};
  39. //要加密的内容
  40. unsigned char sourceMsg[] = "Hello AES 128/192/256";
  41. //加密后的内容
  42. unsigned char encryptMsg[sizeof(sourceMsg)+16] = {0};
  43. //解密后的内容
  44. unsigned char decryptMsg[sizeof(sourceMsg)+16] = {0};
  45. //设置加密方式、密匙
  46. AESInfo_t aesInfo = {
  47. .type = AES256,
  48. .mode = AES_MODE_CBC,
  49. .key = key,
  50. .pIV = IV
  51. };
  52. printf("Build %s %s\r\n", __DATE__, __TIME__);
  53. PrintData("sourceMsg", sourceMsg, strlen((const char *)sourceMsg));
  54. //初始化
  55. AESInit(&aesInfo);
  56. //加密
  57. len = AESEncrypt(&aesInfo, sourceMsg, encryptMsg, strlen((const char *)sourceMsg));
  58. PrintData("encryptMsg", encryptMsg, len);
  59. //解密
  60. len = AESDecrypt(&aesInfo, decryptMsg, encryptMsg, len);
  61. PrintData("decryptMsg", decryptMsg, len);
  62. return 0;
  63. }

aes.c

  1. #include "aes.h"
  2. #include <string.h>
  3. // GF(2^8) 多项式
  4. #define BPOLY 0x1B //x^4 + x^3 + x^1 + x^0= 从右边开始算,bit0、bit
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/51849
推荐阅读
相关标签
  

闽ICP备14008679号