JavaScript的CryptoJS AES/ECB/NoPadding加密,可与JAVA objective-c 进行同步加解密

本文介绍了如何使用JavaScript的CryptoJS库进行AES/ECB/NoPadding加密和解密,以实现与JAVA、Objective-C的兼容。在微信小程序的场景下,由于加密需求不包含偏移量,因此需要进行一些调整。通过引入CryptoJS库并确保加密数据不超过127的Byte数组,成功完成加密。解密过程相对简单,直接将Base64编码的加密字符串传入即可。作者提供了GitHub上的代码示例链接。
摘要由CSDN通过智能技术生成

公司一个蓝牙锁需要把重要协议进行加密传输,硬件结构、加密模式不变,微信小程序、安卓、IOS三端同步加解密。

百度谷歌资料查了不少,都是用CryptoJS。

加解密是没什么问题,只是跟我想要的有点不一样,我们的加密不需要偏移量,所以得稍做修改。

加密模式使用AES/ECB/NoPadding

需要用到网上找到的aes.js mode-ecb.js pad-nopadding.js文件

实际项目用在小程序 这里用JS做Demo

先引入文件

    <script src="./rollups/aes.js?v=1.1"></script>
    <script src="./components/mode-ecb.js?v=1.0"></script>
    <script src="./components/pad-nopadding.js?v=1.0"></script>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
好的,以下是前端使用CryptoJSAES CTR模式进行加密,后端使用JavaAES/CTR/NoPadding进行解密的代码示例: 前端加密代码(使用CryptoJS): ```javascript // 密钥(需要与后端一致) const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 偏移量(需要与后端一致) const iv = CryptoJS.enc.Utf8.parse('abcdef0123456789'); // 加密方法 function encrypt(word) { const srcs = CryptoJS.enc.Utf8.parse(word); const encrypted = CryptoJS.AES.encrypt(srcs, key, { iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding }); return encrypted.toString(); } // 调用加密方法 const encryptedData = encrypt('hello world'); console.log(encryptedData); ``` 后端解密代码(使用Java): ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AesUtil { // 密钥(需要与前端一致) private static final String KEY = "1234567890123456"; // 偏移量(需要与前端一致) private static final String IV = "abcdef0123456789"; /** * AES解密 * @param content 待解密内容 * @param key 密钥 * @param iv 偏移量 * @return */ public static String decrypt(String content, String key, String iv) { try { SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding"); IvParameterSpec ivParam = new IvParameterSpec(iv.getBytes("UTF-8")); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParam); byte[] encryptedBytes = hex2byte(content); byte[] original = cipher.doFinal(encryptedBytes); return new String(original, "UTF-8"); } catch (Exception ex) { ex.printStackTrace(); return null; } } /** * 16进制字符串转字节数组 * @param hex * @return */ public static byte[] hex2byte(String hex) { byte[] bytes = new byte[hex.length() / 2]; for (int i = 0; i < bytes.length; i++) { String subStr = hex.substring(i * 2, i * 2 + 2); boolean isNegative = false; int num = Integer.parseInt(subStr, 16); if (num > 127) { isNegative = true; } if (isNegative) { bytes[i] = (byte) (num - 256); } else { bytes[i] = (byte) num; } } return bytes; } public static void main(String[] args) { // 调用解密方法 String encryptedData = "4e9ce7c1b7259a"; String decryptedData = decrypt(encryptedData, KEY, IV); System.out.println(decryptedData); } } ``` 请注意,JavaAES/CTR/NoPadding需要使用16字节的密钥和偏移量,而CryptoJSAES CTR模式需要使用32字节的密钥和16字节的偏移量。因此,在示例代码中,我们使用CryptoJS.enc.Utf8.parse方法将字符串转换为字节数组。在实际使用中,您需要根据自己的需求调整密钥和偏移量。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值