Java带KeyGenerator***密钥生成器***生成AES加密***c******里面AES解密
本文讨论了Java使用密钥生成器(KeyGenerator)创建AES加密和C++中使用AES解密的过程。具体步骤如下:
一、Java端加密流程:
Java端生成AES加密时,首先需要使用KeyGenerator类创建密钥生成器实例。使用指定的算法(如AES)和密钥大小(通常为128位)初始化KeyGenerator。然后,通过调用其generateKey()方法生成密钥。
二、Java端解密流程(示例代码):
在Java端,解密操作通常需要使用预先生成的密钥。解密通常涉及Cipher类,首先实例化Cipher对象,并使用密钥和Cipher对象的指定模式(如Cipher.DECRYPT_MODE)初始化。然后,通过Cipher对象的update()或doFinal()方法对加密数据进行解密。
三、C++端解密流程:
C++能够解密的关键在于正确获取Java端生成的密钥值。这通常涉及通过某种形式的数据交换或接口,确保C++端能够访问到与Java端相同的密钥。在C++中,可以使用特定的AES库(例如CAesLib)来实现解密操作。
四、测试与验证:
通过Java端生成的密钥与C++端进行解密操作,以验证密钥生成和解密过程的有效性。测试结果应显示出成功解密的预期结果,证明了Java和C++之间的密钥交换和解密操作能够顺利进行。
重要说明:确保在C++端正确获取和使用Java端输出的密钥值是成功解密的关键步骤。具体实现可能涉及使用特定的数据交换机制或跨语言通信协议。
前端RSA密钥生成和加解密window.crypto
crypto API支持常用的rsa、aes加解密,这边介绍rsa的应用。
window.crypto需要chrome 37版本,ie 11,safari 11才支持全部API而基本的加解密在safari 7就可以。
crypto.subtle.generateKey(algorithm, extractable, keyUsages),其中:
1. algorithm参数根据不同算法填入对应的参数对,rsa需要填入 RsaHashedKeyGenParams对象包含有:
2. extractable一般是true,表示是否允许以文本的方式导出key
3. keyUsages是一个数组,里面可选 encrypt, decrypt, sign等
函数结果返回一个promise对象,如果是对称加密会得到一个密钥 CryptoKey类型,这边rsa会得到一个密钥对 CryptoKeyPair,它有2个 CryptoKey成员, privateKey和 publicKey,我们导出密钥为文本或者加解密都将通过这2个成员对象。
window.crypto.subtle.exportKey(format, key),其中:
1. format可选 raw, pkcs8, spki, jwk,我们这边在导出公钥时选 spki,私钥选 pkcs8
2. key就是上面 CryptoKeyPair的 privateKey或者 publicKey
函数返回一个promise对象,结果是一个ArrayBuffer,这边转成pem风格。
window.crypto.subtle.importKey(
format,
keyData,
algorithm,
extractable,
keyUsages
),其中:
1. format可选 raw, pkcs8, spki, jwk,对应之前生成时的选择,我们这边在导入公钥时选 spki,私钥选 pkcs8。
2. keyData,即 window.crypto.subtle.exportKey获得的ArrayBuffer,由于在这里时我们一般只有pem文本的,所以还需要做转换成ArrayBuffer。
3. algorithm这边我们是rsa,需要填入一个 RsaHashedImportParams对象,这边对应 crypto.subtle.generateKey所需的 RsaHashedKeyGenParams对象,含有:
4. extractable同 crypto.subtle.generateKey的
5. keyUsages同 crypto.subtle.generateKey
函数返回一个promise对象,结果是一个 CryptoKey。
加密 crypto.subtle.encrypt(algorithm, key, data),其中:
1. algorithm,加解密只支持RSA-OAEP不支持RSAES-PKCS1-v1_5
2. key即公钥的 CryptoKey对象
3. data是一个 BufferSource对象,不能直接是要加密的字符串。
结果是一个ArrayBuffer,可以使用window.btoa(String.fromCharCode(...new Uint8Array(e)))输出为base64字符串
解密 crypto.subtle.decrypt(algorithm, key, data),基本同加密,这边data对应为加密返回的ArrayBuffer,如果是base64字符串比如从后端加密过来的,就需要转为Uint8Array。
返回值同加密