关于AES加密使用——开发记录

对称密码算法的加密密钥和解密密钥相同,对于大多数对称密码算法,加解密过程互逆。

通常使用的有 DES  3DES  AES  ,加解密

特点:算法公开、计算量小、加密速度快、加密效率高

弱点:双方都使用同样密钥,安全性得不到保证

 

对称密码有流密码和分组密码两种,但是现在普遍使用的是分组密码:

 

分组密码工作模式:

  1. ECB:电子密码本(最常用的,每次加密均产生独立的密文分组,并且对其他的密文分组不会产生影响,也就是相同的明文加密后产生相同的密文

  2. CBC:密文链接(常用的,明文加密前需要先和前面的密文进行异或运算,也就是相同的明文加密后产生不同的密文)

  3. CFB:密文反馈

  4. OFB:输出反馈

  5. CTR:计数器

 

分组密码填充方式:

  1. NoPadding:无填充

  2. PKCS5Padding:

  3. ISO10126Padding:

 

常用对称密码:

  1. DES(Data Encryption Standard,数据加密标准)

  2. 3DES(Triple DES、DESede,进行了三重DES加密的算法

  3. AES(Advanced Encryption Standard,高级数据加密标准,AES算法可以有效抵制针对DES的攻击算法)

————————————————————————————————————————————————————————

愿意到此为止,此篇文章主要记录开发中使用到 AES 加密在Andorid 中的使用,以免下次使用的时候找不到。

    /**
     * AES加密
     *
     * @param content 需要加密的内容
     * @param key     加密密码
     * @return
     */
    public static String encryptAES(String content, String key) {
        byte[] byteContent = new byte[0]; // 避免空指针,设置不占用控件的byte[]
        byte[] encryptedBytes = new byte[0];
        try {
            byteContent = content.getBytes("UTF-8");
            byte[] enCodeFormat = key.getBytes();
            SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");

            // byte[] initParam = IV_STRING.getBytes();
            // IV_STRING AES指定偏移量,可以设置,可以不设置,根据加密模式确定

            // IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
            // 设置偏移量

            // 指定加密的算法、工作模式和填充方式
            Cipher cipher = null;
            cipher = Cipher.getInstance(CIPHER_5ALGORITHM);
            //CIPHER_5ALGORITHM =AES/ECB/PKCS5Padding   AES 加密方式,ECB 模式 , PKCS5Padding 填充方式;

            //cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,ivParameterSpec);
            //cipher.init方法,可以谁知传入偏移量,或者不传入

            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            encryptedBytes = cipher.doFinal(byteContent);
            //最终加密后输入的是 bety【】 数组,这里服务端需要什么格式,直接转换就可以
        } catch (Exception e) {
            LogUtils.e("lipeng",e.toString());
        }
        return bytes2HexString(encryptedBytes);
    }

上述代码直接贴过去就可以,最后加密得到的是一个 bety【】 数组,确定服务端需要使用什么样的数据,可以转换后在传递参数。

注意点:

1、第一key值,对称加密前后端加密秘钥要统一。

2、偏移量是否设置相同的偏移量。

3、填充方式,加密模式 前后端统一。

 

因为java提供了AES加密的API ,所以使用起来还是相对方便,但是由于种种事情,还是踩了一个坑。

注意这是采坑的代码

这里是拷贝的后台的代码,标注是AES加密。但是应该是使用了 DES加密的方式。其中加密模式 BC 有点迷,然后告诉我是AES加密,我这边各种百度出来AES加密后的数据,均无法正确解密。后来没办法了,直接找后台要的他们加密的代码,发现了问题。

如果有DES 3DES AES 各种介绍,工具类。可以参考

https://mp.weixin.qq.com/s/wmBqL2PtLqkZZO5EKsJTJw

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用 Python 语言实现的示例代码: ```python import json from Crypto.Cipher import AES from Crypto.Random import get_random_bytes def encrypt(json_data, key): # 将 JSON 数据序列化为字符串 plaintext = json.dumps(json_data).encode() # 生成 16 字节的随机向量 iv = get_random_bytes(16) # 创建 AES 加密器对象,使用 CBC 模式和 PKCS7 填充 cipher = AES.new(key, AES.MODE_CBC, iv) # 对明文进行加密,并在密文前添加随机向量 ciphertext = iv + cipher.encrypt(pad(plaintext)) # 返回加密后的密文 return ciphertext def decrypt(ciphertext, key): # 从密文中提取随机向量和加密后的数据 iv = ciphertext[:16] ciphertext = ciphertext[16:] # 创建 AES 解密器对象,使用 CBC 模式和 PKCS7 填充 cipher = AES.new(key, AES.MODE_CBC, iv) # 对密文进行解密,并去除填充 plaintext = unpad(cipher.decrypt(ciphertext)) # 将解密后的数据反序列化为 JSON 对象 json_data = json.loads(plaintext.decode()) # 返回解密后的 JSON 对象 return json_data def pad(data): # 计算填充字节数 padding_size = AES.block_size - len(data) % AES.block_size # 在数据末尾添加填充字节 padding = bytes([padding_size]) * padding_size return data + padding def unpad(data): # 计算填充字节数 padding_size = data[-1] # 检查填充是否合法 if padding_size < 1 or padding_size > AES.block_size: raise ValueError("Invalid padding") # 去除填充字节 padding = data[-padding_size:] if padding != bytes([padding_size]) * padding_size: raise ValueError("Invalid padding") return data[:-padding_size] # 测试代码 key = b"0123456789ABCDEF" json_data = {"name": "Alice", "age": 30} ciphertext = encrypt(json_data, key) print("密文:", ciphertext.hex()) plaintext = decrypt(ciphertext, key) print("明文:", plaintext) ``` 在上面的示例代码中,使用 PyCrypto 库提供的 AES 加密和解密函数,将 JSON 数据序列化为字符串后进行加密,并在密文前添加随机向量。在解密时,先从密文中提取随机向量和加密后的数据,再使用相同的密钥和向量进行解密,并去除填充。最后将解密后的数据反序列化为 JSON 对象并返回。 需要注意的是,在使用 CBC 模式的 AES 加密和解密时,必须使用不同的随机向量来加密每个数据块,以增强安全性。在上面的示例代码中,我们将随机向量和加密后的数据一起存储在密文中,以便在解密时使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值