一个超级简单又实用的AES加密解密字符串示例

Advanced Encryption Standard 高级加密标准
在密码学中AES又称Rijndael加密法 是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES

这次例程中可以修改master_aes_object.h中的MasterAesIv[] 和 MasterAesKey[] 的值使用不同的密钥
加密是一比一生成密文 如果用于传入 加密后不会增加传输的带宽压力

如果是传输使用 请使用相同的程序进行解密

测试例程

#include <stdio.h>
#include "aeckey.h"
#include "AES.h"
#include "random.h"
#include <stdlib.h>
#include <string.h>
#include "master_aes_object.h"

int main(){
    char sendBuf[32] = {0};
    unsigned char result[32] = {0};
    strcpy(sendBuf, (char*)"12345678901234567890aabbcc");
    int length = strlen(sendBuf);
    CreateAES();
    printf("%10s : %s\n", "source", sendBuf);
    EncData((unsigned char *)sendBuf, result, strlen(sendBuf));
    printf("%10s : ", "encode");
    for(int i=0; i<length; i++){
        printf("%02x ", (unsigned char)result[i]);
        if((i+1)%10==0)
            printf("\n%10s : ", "");
    }
    printf("\n");
    memcpy(sendBuf, result, length);

    memset(result, 0, sizeof(result));

    //CreateAES();
    EncData((unsigned char *)sendBuf, result, strlen(sendBuf));
    printf("%10s : %s\n", "decode", (char*)result);

    return 0;
}

运行程序:

$ ./a.out 
    source : 12345678901234567890aabbcc
    encode : 35 52 ca 67 1b 18 c9 a6 7a 08 
           : 43 5e 65 13 cf 9d 7b 27 20 94 
           : 04 ac 8e 07 b0 ec 
    decode : 12345678901234567890aabbcc

关于AES中使用接口的一些注意事项以及说明:

// 创建AES对象
//   注意   创建后密钥为空,必需设置密钥
//   返回   AES对象指针,如果为NULL表明创建失败
//   参数
AES *AES_New(void);


// 释放AES对象
//   返回
//   参数   aes -- AES对象指针
void AES_Free(AES *aes);


// 设置工作模式
//   注意   创建后默认工作模式为CTR模式
//          如果使用ECB或CBC模式,加密和解密时所有数据长度必须是AES_BLOCK_SIZE的整数倍 !!!
//   返回   <0 失败; =0 成功
//   参数   aes  -- AES对象指针
//          mode -- AES工作模式
int  AES_SetMode(AES *aes, const int mode);


// 设置密钥
//   返回   <0 失败; =0 成功
//   参数   aes     -- AES对象指针
//          userKey -- AES密钥指针
//          bits    -- AES密钥位数,必须是128、192、或256位
int  AES_SetKey(AES *aes, const unsigned char *userKey, const int bits);


// 设置加密初始向量
//   返回   
//   参数   aes     -- AES对象指针
//          initvec -- AES初始向量
void AES_SetEncInitVec(AES *aes, const unsigned char *initvec);


// 设置解密初始向量
//   返回   
//   参数   aes     -- AES对象指针
//          initvec -- AES初始向量
void AES_SetDecInitVec(AES *aes, const unsigned char *initvec);


// 数据加密
//   注意   加密后的数据与原始数据长度相同,因此输出的加密数据缓冲区长度必须保证 >= length
//   返回   <0 失败; =0 成功
//   参数   aes    -- AES对象指针
//          inbuf  -- 输入的原始数据缓冲区指针
//          outbuf -- 输出的加密数据缓冲区指针,可以与inbuf相同
//          length -- 输入的原始数据长度(字节)
int  AES_DataEncrypt(AES *aes, const unsigned char *inbuf, unsigned char *outbuf, int length);


// 数据解密
//   注意   解密后的数据与加密数据长度相同,因此输出的解密数据缓冲区长度必须保证 >= length
//   返回   <0 失败; =0 成功
//   参数   aes    -- AES对象指针
//          inbuf  -- 输入的加密数据缓冲区指针
//          outbuf -- 输出的解密数据缓冲区指针,可以与inbuf相同
//          length -- 输入的加密数据长度(字节)
int  AES_DataDecrypt(AES *aes, const unsigned char *inbuf, unsigned char *outbuf, int length);

那么这种加密属于什么样的加密方式
是的 对称加密 也称为单密钥加密

所谓对称,就是采用这种加密方法的双方使用同样的密钥进行加密和解密

对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。
如果一方的秘钥被泄露,那么加密信息也就不安全了

点击查看工程源码以及实例程序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 在 Java 中,我们可以使用 javax.crypto 库中的 Cipher 类进行 AES 加密和解密操作。具体步骤如下: 1. 创建 Cipher 对象 ```java Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); ``` 2. 创建密钥 ```java SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); ``` 其中,keyBytes 是一个 byte 数组,表示密钥的内容。 3. 初始化 Cipher 对象 ```java cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); ``` 其中,ivBytes 是一个 byte 数组,表示初始化向量。 4. 加密或解密数据 ```java byte[] result = cipher.doFinal(dataBytes); ``` 其中,dataBytes 是一个 byte 数组,表示要加密或解密的数据。 5. 将加密或解密后的结果转换成字符串或字节数组 如果需要将加密或解密后的结果转换成字符串,可以使用 Base64 编码。具体代码如下: ```java String resultStr = Base64.getEncoder().encodeToString(result); ``` 如果需要将加密或解密后的结果转换成字节数组,可以直接使用得到的 result 数组。 完整的示例代码如下: ```java import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AesUtils { public static byte[] encrypt(byte[] keyBytes, byte[] ivBytes, byte[] dataBytes) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); return cipher.doFinal(dataBytes); } public static byte[] decrypt(byte[] keyBytes, byte[] ivBytes, byte[] dataBytes) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec secretKey = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(ivBytes)); return cipher.doFinal(dataBytes); } public static void main(String[] args) throws Exception { String dataStr = "hello, world!"; byte[] keyBytes = "0123456789abcdef".getBytes(); byte[] ivBytes = "0123456789abcdef".getBytes(); byte[] dataBytes = dataStr.getBytes(); // 加密 byte[] encryptedBytes = encrypt(keyBytes, ivBytes, dataBytes); String encryptedStr = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println(encryptedStr); // 解密 byte[] decryptedBytes = decrypt(keyBytes, ivBytes, encryptedBytes); String decryptedStr = new String(decryptedBytes); System.out.println(decryptedStr); } } ``` 希望这个答案能够帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值