aes算法cbc模式c语言,AES算法及它的CBC加密模式

AES四種加密模式的區別:

ECB(Electronic Code Book電子密碼本)模式

ECB模式是最早采用和最簡單的模式,它將加密的數據分成若干組,每組的大小跟加密密鑰長度相同,然后每組都用相同的密鑰進行加密。

優點:   1.簡單;   2.有利於並行計算;  3.誤差不會被擴散;

缺點:   1.不能隱藏明文的模式;  2.可能對明文進行主動攻擊;因此,此模式適於加密小消息。

CBC(Cipher Block Chaining,加密塊鏈)模式

優點:  不容易主動攻擊,安全性好於ECB,適合傳輸長度長的報文,是SSL、IPSec的標准。

缺點:  1.不利於並行計算;  2.誤差傳遞;  3.需要初始化向量IV

CFB(Cipher FeedBack Mode,加密反饋)模式

優點:  1.隱藏了明文模式;  2.分組密碼轉化為流模式;  3.可以及時加密傳送小於分組的數據;

缺點:  1.不利於並行計算;  2.誤差傳送:一個明文單元損壞影響多個單元;  3.唯一的IV;

OFB(Output FeedBack,輸出反饋)模式

優點:  1.隱藏了明文模式;  2.分組密碼轉化為流模式;  3.可以及時加密傳送小於分組的數據;

缺點:  1.不利於並行計算;  2.對明文的主動攻擊是可能的;  3.誤差傳送:一個明文單元損壞影響多個單元;

2. AES算法

AES使用采用CBC算法模式,PKCS5/PKCS7填充模式,向量和密鑰相同。

明文 hello,world!

密鑰 chinashanghaijky

密文

byte(-128~127)  35,118,54,20,-110,33,-7,92,121,-103,21,52,-119,96,-120,-30

byte(0~256) 35,118,54,20,146,33,149,92,121,153,21,52,137,96,126,226

十六進制 237636149221f95c79991534896088e2

備注:對於byte類型,由於不同言語對應的值范圍不同,如C、C++、java是-128~127,C#是0~256,因此對應范圍不同的值在不同語言中顯示值會有不同,但對結果沒有影響。

采用“在線AES加解密”對上述加密過程進行驗證,驗證結果如下圖所示:

e46dc96cf784ab60f32becd858b36ba8.jpe

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AES/CBC/PKCS7Padding是一种常用的加密算法,可用于对数据进行保护。在C语言中,可以通过使用OpenSSL库来实现该算法。 下面是一个使用AES/CBC/PKCS7Padding加密算法的示例代码: ```c #include <openssl/aes.h> #include <openssl/rand.h> #define AES_BLOCK_SIZE 16 void encrypt(const unsigned char *plaintext, int plaintext_len, const unsigned char *key, const unsigned char *iv, unsigned char *ciphertext) { AES_KEY aesKey; AES_set_encrypt_key(key, 128, &aesKey); AES_cbc_encrypt(plaintext, ciphertext, plaintext_len, &aesKey, iv, AES_ENCRYPT); } void decrypt(const unsigned char *ciphertext, int ciphertext_len, const unsigned char *key, const unsigned char *iv, unsigned char *plaintext) { AES_KEY aesKey; AES_set_decrypt_key(key, 128, &aesKey); AES_cbc_encrypt(ciphertext, plaintext, ciphertext_len, &aesKey, iv, AES_DECRYPT); } int main() { unsigned char key[AES_BLOCK_SIZE] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; unsigned char iv[AES_BLOCK_SIZE]; unsigned char plaintext[32] = "Hello, AES/CBC/PKCS7Padding"; unsigned char ciphertext[sizeof(plaintext)]; unsigned char decryptedtext[sizeof(plaintext)]; RAND_bytes(iv, sizeof(iv)); encrypt(plaintext, sizeof(plaintext), key, iv, ciphertext); decrypt(ciphertext, sizeof(ciphertext), key, iv, decryptedtext); printf("Original Text: %s\n", plaintext); printf("Encrypted Text: %s\n", ciphertext); printf("Decrypted Text: %s\n", decryptedtext); return 0; } ``` 以上代码使用了OpenSSL库中的AES函数,分别实现了加密和解密的功能。主函数中生成了一个16字节的密钥和随机生成的16字节初始化向量。然后将明文进行加密,并将密文进行解密,最后打印出原始文本、加密文本和解密文本。 需要注意的是,加密后生成的密文长度要比原始明文长度稍长,因此ciphertext的长度使用了sizeof(plaintext)。为了避免截断问题,推荐使用静态大小的缓冲区来存储密文。 这只是一个简单的示例,实际应用中还需考虑安全性、密钥管理等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值