aes 坑

该博客主要展示了使用JavaScript实现AES加密和解密的代码。包含KEY盐值转换函数,以及加密和解密数据的函数,并给出了示例数据进行加密和解密操作,输出了各步骤的结果,体现了AES在数据安全方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>aes</title>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <script src="jquery.js"></script>
  <script src="crypto-js.js"></script>
</head>
<body>
<script>
/**
 * KEY盐值转换
 */
function getKey(key) {
  var realKey = CryptoJS.SHA1(key);
  realKey = CryptoJS.SHA1(realKey).toString().substring(0, 32); //真正的key
  return realKey;
}

/**
 * 加密数据
 */
var aesEncrypt = function(data, keyStr, ivStr) {
    var sendData = CryptoJS.enc.Utf8.parse(data);

    var key = CryptoJS.enc.Utf8.parse(keyStr);

    var realKey = getKey(keyStr);

    var iv_  = CryptoJS.enc.Utf8.parse(ivStr);

    var encrypted = CryptoJS.AES.encrypt(sendData, CryptoJS.enc.Hex.parse(realKey),{
        iv:iv_,
        mode:CryptoJS.mode.OFB,
        padding:CryptoJS.pad.Pkcs7
      });

       
    console.log("原始值:"+data);
    console.log("UTF-8后:"+sendData);
    var encryptedStr = encrypted.ciphertext.toString();
    console.log('加密后        '+encryptedStr);
      console.log("加密转大写后:"+encryptedStr.toUpperCase());
    //console.log("HEX加密:"+ CryptoJS.enc.Hex.parse(encrypted.ciphertext));
    console.log("Base64加密:"+CryptoJS.enc.Base64.stringify(encrypted.ciphertext));
        //return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
    return encryptedStr.toUpperCase();
};

function aesDecrypt(data,keyStr,ivStr) {
    console.log("原始值:"+data);

   var cipherTextHexStr = CryptoJS.enc.Hex.parse(data);
   var cipherTextBase64Str = CryptoJS.enc.Base64.stringify(cipherTextHexStr);

    var key = CryptoJS.enc.Utf8.parse(keyStr);

    var realKey = getKey(keyStr);

    var iv_  = CryptoJS.enc.Utf8.parse(ivStr);

    var decrypt = CryptoJS.AES.decrypt({
       // ciphertext: CryptoJS.enc.Base64.parse(cipherTextBase64Str)
        ciphertext: cipherTextHexStr
    }, CryptoJS.enc.Hex.parse(realKey), {
      iv:iv_,
      mode: CryptoJS.mode.OFB,
      padding: CryptoJS.pad.Pkcs7
    });

    console.log("解密后0:"+decrypt.toString());

    console.log("解密后1:"+decrypt.toString(CryptoJS.enc.Utf8));

    return decrypt.toString(CryptoJS.enc.Utf8);
}

let word ='18719800158';
let key='1234567812345679';
let iv ='1234567812345678';

console.log('最终结果:'+aesEncrypt(word,key,iv));

console.log('------------------------------开始解密------------------------------');

let decode = 'F2AD339655A76FF875FA6FAF02072ACF';
console.log('最终结果:'+aesDecrypt(decode,key,iv));

</script>
</body>
</html>

 

连续折腾三天。。。

<think>好的,我现在需要帮用户将C#的AES加密代码转换为使用Hutool库的Java代码。首先,我得仔细看看用户提供的C#代码和之前的历史对话,确保转换后的Java代码与C#兼容。 用户之前的提问已经得到了关于标准Java实现的回答,但这次他希望用Hutool库来实现。Hutool是一个Java工具库,封装了很多常用的功能,包括加密解密,所以需要查阅Hutool的AES相关文档。 首先,回顾C#代码中的关键点:使用AES算法,CBC模式,PKCS7填充,密钥和IV都是byte数组,加密后的结果用Base64编码。Hutool的AES工具类是否支持这些参数? 根据Hutool的文档,AESUtil类提供了便捷的方法。默认情况下,Hutool的AES可能使用ECB模式,所以需要明确指定CBC模式。另外,填充方式需要设置为PKCS7Padding,但Java标准库中的PKCS5Padding实际上和PKCS7是兼容的,不过Hutool可能直接支持PKCS7。 然后,密钥和IV的处理。C#中的key和iv是byte数组,Java中同样需要使用byte数组传入。Hutool的AESUtil的构造方法接受密钥和IV参数,应该是byte数组形式。 接下来是加密过程。在C#中,使用CreateEncryptor创建加密器,然后将明文写入CryptoStream。Hutool可能直接提供一个encrypt方法,接受明文字符串或字节数组,并返回加密后的字节数组,再进行Base64编码。 需要注意字符编码的问题,C#中使用UTF-8编码明文,Java中同样需要指定UTF-8。Hutool的方法可能需要将明文转换为UTF-8字节数组,或者在加密方法中指定编码。 另外,Base64编码部分,Hutool提供了Base64工具类,可以方便地将字节数组转换为Base64字符串,确保和C#的Convert.ToBase64String结果一致。 还需要测试转换后的Java代码是否与C#生成的密文相同。比如,使用相同的key和iv,相同的明文,加密后的Base64结果应该一致。如果有差异,可能需要检查模式、填充、密钥和IV的处理是否正确。 用户提供的引用中提到了PHP的例子,其中密钥和IV是16字节的字符串,转换为ASCII字节数组。在Java中,如果密钥和IV是byte数组传入,需要确保来源正确,比如用户可能使用类似的方法生成key和iv。 可能遇到的:Hutool的AESUtil是否在CBC模式下需要IV,是否默认使用PKCS7填充。需要确认Hutool的AESUtil构造方法是否接受IV参数,并在初始化时设置正确的模式。 总结步骤: 1. 引入Hutool依赖。 2. 使用AESUtil创建实例,传入key和iv的byte数组,指定模式为CBC,填充为PKCS7Padding。 3. 加密明文,使用UTF-8编码。 4. 对加密结果进行Base64编码。 5. 处理可能的异常,比如密钥长度不正确,IV长度不正确等。 验证部分,需要编写测试用例,使用相同的参数运行C#和Java代码,比较输出是否一致。如果不一致,检查各参数是否匹配,特别是模式和填充是否设置正确。 最后,用户可能还需要解密的方法,但当前问题只涉及加密,所以暂时不需要处理解密部分。不过可以在相关问题中提及,或者示例代码中给出解密方法供参考。</think>根据C# AES加密代码转换为Java Hutool实现的解决方案如下: ### Hutool实现与C#兼容的AES加密 ```java import cn.hutool.crypto.Mode; import cn.hutool.crypto.Padding; import cn.hutool.crypto.symmetric.AES; import java.nio.charset.StandardCharsets; public class AesHutoolUtil { /** * AES加密(CBC/PKCS7Padding) * @param plainText 明文 * @param key 密钥字节数组(16/24/32字节) * @param iv 初始化向量字节数组(16字节) * @return Base64编码的密文 */ public static String encrypt(String plainText, byte[] key, byte[] iv) { // 创建AES实例(参数与C#代码严格对应) AES aes = new AES(Mode.CBC, Padding.PKCS7Padding, key, iv); // 执行加密并Base64编码 return aes.encryptBase64(plainText, StandardCharsets.UTF_8); } } ``` ### 三向验证步骤(确保与C#兼容) 1. **参数一致性验证**: ```java // 测试用例(需与C#测试参数相同) String plainText = "Hello AES!"; byte[] key = "1234567890123456".getBytes(StandardCharsets.US_ASCII); // 128位密钥 byte[] iv = "abcdefghijklmnop".getBytes(StandardCharsets.US_ASCII); // 16字节IV String encrypted = AesHutoolUtil.encrypt(plainText, key, iv); System.out.println("Hutool加密结果:" + encrypted); ``` 2. **跨语言验证**: ```csharp // 对应的C#测试代码(结果应相同) var encrypted = Encrypt("Hello AES!", Encoding.ASCII.GetBytes("1234567890123456"), Encoding.ASCII.GetBytes("abcdefghijklmnop")); Console.WriteLine($"C#加密结果:{encrypted}"); ``` 3. **解码验证**: ```java // 使用Hutool解密验证 String decrypted = aes.decryptStr(encrypted, StandardCharsets.UTF_8); System.out.println("解密结果:" + decrypted); // 应输出"Hello AES!" ``` ### 核心配置对照表 | C# 参数 | Hutool 对应配置 | 技术要点 | |----------------------|-----------------------------------|------------------------------------------------------------------------| | `Aes.Create()` | `new AES()` | Hutool自动处理算法版本选择 | | `CipherMode.CBC` | `Mode.CBC` | 必须显式指定加密模式[^1] | | `PaddingMode.PKCS7` | `Padding.PKCS7Padding` | Java标准库中PKCS5与PKCS7兼容 | | `Encoding.UTF8` | `StandardCharsets.UTF_8` | 字符编码必须严格一致 | | `Convert.ToBase64String` | `encryptBase64()` | Hutool内置Base64编码功能 | ### 常见问题处理 1. **密钥长度异常**: ```java // 密钥长度校验(Hutool内部已做验证) if (key.length != 16 && key.length != 24 && key.length != 32) { throw new IllegalArgumentException("密钥长度必须为16/24/32字节"); } ``` 2. **IV不匹配问题**: ```java // IV长度强制校验 if (iv.length != 16) { throw new IllegalArgumentException("IV必须是16字节"); } ``` ### 性能优化建议 1. **对象复用**: ```java // 高频调用场景可复用AES实例 private static final AES cachedAes = new AES(Mode.CBC, Padding.PKCS7Padding, key, iv); public static String fastEncrypt(String text) { return cachedAes.encryptBase64(text); } ``` 2. **线程安全验证**: - Hutool的`AES`对象线程安全(内部每次加密创建新`Cipher`实例)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值