JAVA的AES加密示例
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AesUtil {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM =
"AES/CBC/PKCS5Padding";
public static String encrypt(String strKey, String strIn) throws Exception {
SecretKeySpec skeySpec = getKey(strKey);
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(strKey.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(strIn.getBytes());
String aesResult = new String(Base64.getEncoder().encode(encrypted),
StandardCharsets.UTF_8);
return aesResult.replace("/", "_");
}
private static SecretKeySpec getKey(String strKey) throws Exception {
byte[] arrBTmp = strKey.getBytes();
byte[] arrB = new byte[16];
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
return new SecretKeySpec(arrB, KEY_ALGORITHM);
}
}
这个是我用python写的AES加密
from Crypto.Cipher import AES
import base64
from time import sleep
class aescrypt:
def init(self, key, model, iv, encode_):
self.encode_ = encode_
self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
self.key = self.add_16(key)
if model == 'ECB':
self.aes = AES.new(self.key, self.model) # 创建一个aes对象
elif model == 'CBC':
self.aes = AES.new(self.key, self.model, iv, segment_size=128) # 创建一个aes对象
elif model == 'CFB':
self.aes = AES.new(self.key, self.model)
这里的密钥长度必须是16、24或32
def add_16(self, par):
par = par.encode(self.encode_)
while len(par) % 16 != 0:
par += b'n'
return par
def aesencrypt(self, text): # 此处text传入的值为cleartext
text = self.add_16(text)
print(text)
self.encrypt_text = self.aes.encrypt(text)
return base64.encodebytes(self.encrypt_text).decode().strip()
def aesdecrypt(self, text):
text = base64.decodebytes(text.encode(self.encode_))
self.decrypt_text = self.aes.decrypt(text)
return self.decrypt_text.decode(self.encode_).strip('\0')
if name == '__main__':
keyy = input("输入密钥:")
cleartext = input("输入明文:")
pr = aescrypt(keyy, 'CBC', IV, 'utf8'),此处为加密模式及内容,IV
en_text = pr.aesencrypt(cleartext)
print('密文:', en_text)
print('明文:', pr.aesdecrypt(en_text))
这里我写了两个加密模式,上述代码已经换成同样的CBC模式加密