AES128加密解密整理Demo(aes在线加密解密文本测试)

2023-03-16 8:10:56 密码用途 思思

github地址: AES128Demo

demo主要功能及需要阐述的基本情况:

一、功能:

与后台、接口进行信息传递时文本的加密解密操作。采用的技术是AES128加密

二、基本情况:

1、base64加密用的是系统自带的方法。

2、填充方式是采用的是无填充 No padding 因为填充的话,后台语言不同填充方式不同,容易冲突

3、使用的时候请把.m文件打包成静态库

4、参考文件: AES128原理   AES128第三方加密解密

5、对demo有疑问或者有异议的感谢指教。谢谢大家

三、以下是UI效果图

AES、RSA、ECC性能测试

环境:ubuntu-14.04,8核,32G内存,64位系统

AES秘钥长度:128

结论:AES加密和解密的速度跟要加密的内容长度的关系不大,解密效率要比加密效率高。

下面是RSA、ECC的在不同秘钥长度下的测试结果:

如何使用CryptoJS的AES方法进行加密和解密

首先准备一份明文和秘钥:

var plaintText = 'aaaaaaaaaaaaaaaa'; // 明文

var keyStr = 'bbbbbbbbbbbbbbbb'; // 一般key为一个字符串

参看官网文档,AES方法是支持AES-128、AES-192和AES-256的,加密过程中使用哪种加密方式取决于传入key的类型,否则就会按照AES-256的方式加密。

CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.

由于Java就是按照128bit给的,但是由于是一个字符串,需要先在前端将其转为128bit的才行。

最开始以为使用CryptoJS.enc.Hex.parse就可以正确地将其转为128bit的key。但是不然...

经过多次尝试,需要使用CryptoJS.enc.Utf8.parse方法才可以将key转为128bit的。好吧,既然说了是多次尝试,那么就不知道原因了,后期再对其进行更深入的研究。

// 字符串类型的key用之前需要用uft8先parse一下才能用

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

由于后端使用的是PKCS5Padding,但是在使用CryptoJS的时候发现根本没有这个偏移,查询后发现PKCS5Padding和PKCS7Padding是一样的东东,使用时默认就是按照PKCS7Padding进行偏移的。

// 加密

var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

由于CryptoJS生成的密文是一个对象,如果直接将其转为字符串是一个Base64编码过的,在encryptedData.ciphertext上的属性转为字符串才是后端需要的格式。

var encryptedBase64Str = encryptedData.toString();

// 输出:'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=

console.log(encryptedBase64Str);

// 需要读取encryptedData上的ciphertext.toString()才能拿到跟Java一样的密文

var encryptedStr = encryptedData.ciphertext.toString();

// 输出:'44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06

console.log(encryptedStr);

由于加密后的密文为128位的字符串,那么解密时,需要将其转为Base64编码的格式。

那么就需要先使用方法CryptoJS.enc.Hex.parse转为十六进制,再使用CryptoJS.enc.Base64.stringify将其变为Base64编码的字符串,此时才可以传入CryptoJS.AES.decrypt方法中对其进行解密。

// 拿到字符串类型的密文需要先将其用Hex方法parse一下

var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);

// 将密文转为Base64的字符串

// 只有Base64类型的字符串密文才能对其进行解密

var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);

使用转为Base64编码后的字符串即可传入CryptoJS.AES.decrypt方法中进行解密操作。

// 解密

var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {

mode: CryptoJS.mode.ECB,

padding: CryptoJS.pad.Pkcs7

});

经过CryptoJS解密后,依然是一个对象,将其变成明文就需要按照Utf8格式转为字符串。

// 解密后,需要按照Utf8的方式将明文转位字符串

var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);

console.log(decryptedStr); // 'aaaaaaaaaaaaaaaa'

破解aes密码

算法破解就是找到加密算法的漏洞,进行技巧性的破解。

暴力破解是在知道加密算的情况下,用各种密码去测试。关于暴力破解也不是真正的暴力,有很多技术巧。如有效的密码字典就是一例。

AES目前没有算法浮出水面。

AES暴力破解与密码强度(如字串的MD5值就难,简单字串在密码字典排序告前,相对容易一些)和计算能力有关。但AES密钥长度太长,各种排列组合简直是天文数字,现有能力民间单机不可能破解。当然也可能一买彩票就中大奖,但似乎比那概率小得多。

OC对称加密-AES加密/解密

通常采用同一个秘钥进行信息的加密和解密操作,称为单秘钥加密,也称为对称加密。

这里介绍其中一种对称加密算法 -- AES,采用唯一的key进行加密和解密

对称加密的优点:

算法公开,计算量小,加密速度快,加密效率高。

缺点:

双方使用相同的钥匙,安全性得不到保证。

使用对称加密需要注意的是秘钥的保密性,并且秘钥要求定期更换

写一个NSString分类,NSString+wxAES.h:

NSString+wxAES.m:

使用示例:

打印结果为:

java编程一个AES加密txt文件的程序,其中AES解密文件的方法出错,求大神搭救

你是对文件内容加的密,应该和文件类型无关把。如果用的是

AES算法加的密的话,初始化的时候就会写到

keygen = KeyGenerator.getInstance("AES");

//生成密钥

deskey = keygen.generateKey();

//生成Cipher对象,指定其支持的DES算法

c = Cipher.getInstance("AES");

加密和解密的过程几乎是一样的,AES是对称加密方式,你看看加密和解密方法里的有没有写错的地方。