AES加密数据:Python加密Java解密

发布时间:2024年01月02日

总体步骤,分2步:

1.Python加密存入数据库

1.1 AES加密,CBC模式

1.2 秘钥Key 和 向量异或 IV

1.3数据加盐PKCS5Padding

1.4 Base64转码

2.Java解密API传前端展示

代码示例:

1.Python加密存入数据库

needAESText= "需要加密文本"

secret_key = '输入自定义16位的秘钥'
iv = '输入自定义16位的向量,可理解为也是一种秘钥'

# define the padding func
BLOCK_SIZE = AES.block_size
pad = lambda s: s + (BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s.encode()) % BLOCK_SIZE)

# padding to 16  or *16
needAESText = pad(needAESText).encode()

print("padded :", needAESText )

# encryption

# init
cipher = AES.new(key=secret_key.encode(), mode=AES.MODE_CBC, IV=iv.encode())

# encryption
encrypted_text = cipher.encrypt(needAESText)
encrypedText = b64encode(encrypted_text).decode('utf-8')

2.JAVA解密

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;


    private static final String sKey = "输入自定义16位的秘钥";
    private static final String ivParameter = "输入自定义16位的向量,可理解为也是一种秘钥";

    public String decrypt(String str) throws Exception {
        try {
            byte[] raw = sKey.getBytes();
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes()); //偏移量
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
            byte[] encrypted1 = Base64.decodeBase64(str);
            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original, "utf-8");
            return originalString;
        } catch (Exception ex) {
            return null;
        }
    }



????????// 已加密文本
        String content = "已加密文本";
        System.out.println("this is encryed : "+content);

        String decrypted = decrypt(content);


        if(decrypted == null){
            return "decry result is null!";
        }else {
            System.out.println("解密后:" + decrypted);
            return decrypted;
        }





----------------------------------

   
加密简介

加密类型

有对称加密 和 非对称加密

对称加密

DES 和 AES都是属于对称加密,

对称 可以理解为,明文和秘钥有个对称关系,像跷跷板一样,秘钥是支点。

明文? <======秘钥======>密文

密文和铭文 通过相同的秘钥相互转换。

不对称加密

不对称那就不同呗,加密和解密的秘钥不相同。

所以相对来讲 不对称更安全点。

这里主要介绍下对称加密

DES和AES两种对称加密的不同模式对照

DESAES
特点不够安全DES升级版,相对安全
模式ECBCBCCFBECBCBCCFB

8字节秘钥,

不需要IV向量

适合小文本,

不够安全

速度快

16字节秘钥,

需要IV向量

适合长文本

相对ECB安全

速度相对ECB慢

比CBC更安全,速度更慢同上同上同上

==============================完整介绍==================================

AES加密介绍

CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)

1. 加密

加密时,明文首先与IV异或,然后将结果进行块加密,得到的输出就是密文,同时本次的输出密文作为下一个块加密的IV。?

2. 解密

解密时,先将密文的第一个块进行块解密,然后将结果与IV异或,就能得到明文,同时,本次解密的输入密文作为下一个块解密的IV。?

  1. 简介

AES,全称为 Advanced Encryption Standard,是一种分组密码算法,用于保护敏感数据的传输和存储。AES 分为 128 位和 256 位两种密钥长度,可以对数据进行加密和解密,保证数据的安全性和完整性。AES 主要应用于电子商务、移动支付、网络安全等领域,被广泛运用于现代社会的各个方面。AES 算法被设计为高度安全,可以在理论上保证其分组密码的安全性。然而,由于其复杂性和密钥长度,AES 算法的实现和应用也具有一定的技术难度。因此,在应用 AES算法时,需要注意加强密钥管理和安全性保障。

这个标准用来替代原先的 DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。

AES 算法具有很多优点,例如快速、安全、可靠等。它可以加密大量数据,而不会因为加密过程中的数据量过大而变得缓慢。此外,AES 算法还支持块大小的自动调整,可以处理不同大小的数据块。

2.AES 加密模式

2.1、加密方式

ECB(Electronic Codebook)模式:这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。加密时,使用一个密钥,将明文中的每个字符与密钥中对应位置的字符进行异或运算,得到密文。

CBC(Cipher Block Chaining)模式:这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。加密时,使用一个密钥和一个初始化向量(IV),初始化向量是一个16字节的向量,包含了加密算法所需的所有信息。

CFB(Cipher Feedback)模式:这种模式是一种较为复杂的加密模式,它结合了CBC和CTR两种模式的优点。在CFB模式中,加密过程中使用一个密钥和一个随机生成的初始化向量(IV),然后对明文进行加密。在加密完成后,通过对明文进行非对称加密来生成密文的向量。随后,通过对密文进行反向操作,将密文的向量与明文的向量进行异或运算,得到解密所需的密钥。

需要注意的是,ECB、CBC、CFB等模式都是对称加密算法,加密和解密使用相同的密钥。在使用这些算法时,需要注意保护密钥的安全,避免被恶意获取。

2.2、安全性

ECB 不够安全,只适合于短数据的加密,而 CBC 和 CFB 相较于 ECB 更加安全,因为前一个密文块会影响当前明文块,使攻击者难以预测密文的结构。

2.3、速度

ECB 是最简单的加密方式,速度最快,但由于安全性差不建议使用,CBC 因为每个明文块都要与前一个密文块进行异或操作,比 ECB 要慢一些,CFB 因为需要反复加密和解密,速度可能会更慢。

总的来说,选择 AES 的算法模式需要根据加密需要的安全性和速度来进行选择,通常推荐使用CBC 或 CFB 模式,而不是 ECB 模式。

文章来源:https://blog.csdn.net/hzp666/article/details/135335201
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。