基于C语言的AES加密算法实现

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 基于C语言的AES加密算法实现

本文只说明AES算法的使用,不对其原理做过多的说明,想要了解其原理的读者,可自行在网上搜索。


更多关于C语言练习的网站:C语言练习


文末下载源码


AES简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。对称加密算法也就是加密和解密用相同的密钥


对称加密算法


  • 加密和解密用到的密钥是相同的,这种加密方式加密速度非常快,适合经常发送数据的场合。缺点是密钥的传输比较麻烦。


非对称加密算法


  • 加密和解密用的密钥是不同的,这种加密方式是用数学上的难解问题构造的,通常加密解密的速度比较慢,适合偶尔发送数据的场合。优点是密钥传输方便。常见的非对称加密算法为RSA、ECC和EIGamal。


AES加密算法的具体加密流程如下图:


e7a210b13256429d9674b5fc72c10d26.png


明文P


没有经过加密的原始数据。


密钥K


用来加密原始数据的密码,在对称算法中,加密与解密过程所需要的密钥都是相同的。

该密钥不能直接进行传输,否则会造成密钥泄露;常规的做法是使用非对称算法对密钥进行加密之后再进行传输。


AES加密函数


加密函数将传入的密钥K与明文P进行处理,之后生成一个被加密的信息密文C。


密文C


经过密钥加密后的数据。


AES解密函数


解密函数将传入的密钥K与密文C进行处理,之后生成一个没有加密的明文P。


AES加密算法C语言实现


算法源文件可在文末进行获取


函数说明


aes算法相关接口都在aes.h内,主要有以下几个接口

uint8_t *aes_init(size_t key_size);
void aes_key_expansion(uint8_t *key, uint8_t *w);
void aes_inv_cipher(uint8_t *in, uint8_t *out, uint8_t *w);
void aes_cipher(uint8_t *in, uint8_t *out, uint8_t *w);

aes_init()函数

作用:初始化aes变量,创建扩展密钥所需要的内存

key_size:扩展密钥所需内存大小


aes_key_expansion()

作用:创建扩展密钥

key: 扩展密钥

w:扩展密钥内存首地址


aes_inv_cipher()

作用:数据解密

in:输入加密的信息

out:输出解密后的信息

w:扩展密钥内存首地址


aes_cipher()

作用:数据加密

in:输入未加密的信息

out:输出加密后的信息

w:扩展密钥内存首地址


示例

int main() {
  uint8_t i = 0;
  /* 256 bit key */
  uint8_t key[] = {
    0x00, 0x01, 0x02, 0x03,
    0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b,
    0x0c, 0x0d, 0x0e, 0x0f,
    0x10, 0x11, 0x12, 0x13,
    0x14, 0x15, 0x16, 0x17,
    0x18, 0x19, 0x1a, 0x1b,
    0x1c, 0x1d, 0x1e, 0x1f};
  uint8_t in[] = {
    0x00, 0x11, 0x22, 0x33,
    0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xaa, 0xbb,
    0xcc, 0xdd, 0xee, 0xff};
  uint8_t out[16];
  uint8_t *w = NULL;
  w = aes_init(sizeof(key));
  aes_key_expansion(key, w);
  printf("Plaintext message:\n");
  for (i = 0; i < 4; i++) {
    printf("%02x %02x %02x %02x ", in[4*i+0], in[4*i+1], in[4*i+2], in[4*i+3]);
  }
  printf("\n");
  aes_cipher(in, out, w);
  printf("Ciphered message:\n");
  for (i = 0; i < 4; i++) {
    printf("%02x %02x %02x %02x ", out[4*i+0], out[4*i+1], out[4*i+2], out[4*i+3]);
  }
  printf("\n");
  aes_inv_cipher(out, in, w);
  printf("Original message (after inv cipher):\n");
  for (i = 0; i < 4; i++) {
    printf("%02x %02x %02x %02x ", in[4*i+0], in[4*i+1], in[4*i+2], in[4*i+3]);
  }
  printf("\n");
  free(w);
  return 0;
}


相关文章
|
3月前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
228 43
|
3月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
|
4月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
103 1
|
28天前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
22天前
|
存储 安全 算法
AES算法
【10月更文挑战第30天】AES算法
37 2
|
3月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
3月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
139 8
|
2月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
96 0
|
2月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)

热门文章

最新文章

下一篇
无影云桌面