Java 使用RSA加密的AES密钥对文本进行编码

Java 使用RSA加密的AES密钥对文本进行编码,java,aes,rsa,decode,encode,Java,Aes,Rsa,Decode,Encode,首先,请原谅我英语不好,这不是我的母语 我正在尝试编码,然后解码一些不同长度的文本 我尝试用java中的RSA算法对一些文本进行编码。在这个过程中,我发现RSA编码被限制为特定的字节大小,因此这种方法不适合我的规范,因为我的文本可能会很大 由于我只想保留公钥和私钥,我想到了使用“硬编码”AES密钥的想法,该密钥将使用RSA公钥进行编码,然后使用该密钥对数据进行编码。(见守则) //harcoded secretkey base64 encoded 私有静态最终字符串secretkey_base6

首先,请原谅我英语不好,这不是我的母语

我正在尝试编码,然后解码一些不同长度的文本

我尝试用java中的RSA算法对一些文本进行编码。在这个过程中,我发现RSA编码被限制为特定的字节大小,因此这种方法不适合我的规范,因为我的文本可能会很大

由于我只想保留公钥和私钥,我想到了使用“硬编码”AES密钥的想法,该密钥将使用RSA公钥进行编码,然后使用该密钥对数据进行编码。(见守则)

//harcoded secretkey base64 encoded
私有静态最终字符串secretkey_base64=“xtnN6Pove5AovbLXtGRJKw=”;
//这就是RSA密钥的生成方式
公共静态密钥对genKeys()引发异常{
KeyPairGenerator kpg=KeyPairGenerator.getInstance(“RSA”);
kpg.初始化(2048);
KeyPair kp=kpg.generateKeyPair();
返回kp;
}
//这里的文本应该被编码
公共静态字符串encodeText(字符串明文、公钥公钥)引发异常
{
Cipher encryptCipher=Cipher.getInstance(“RSA”);
encryptCipher.init(Cipher.ENCRYPT_模式,公钥);
byte[]cipherText=encryptCipher.doFinal(CryptoUtil.secretkey_base64.getBytes(UTF_8));
字符串encodedSecKey=Base64.getEncoder().encodeToString(密文);
SecretKeySpec k=新的SecretKeySpec(Base64.getDecoder().decode(encodedSecKey),“AES”);
Cipher AESChipher=Cipher.getInstance(“AES”);
aesciper.init(Cipher.ENCRYPT_模式,k);
byte[]byteCipherText=aesciper.doFinal(plainText.getBytes());
返回Base64.getEncoder().encodeToString(字节密文);
}
显然,这不起作用,因为RSA编码的AES密钥对于AES加密来说太长。抛出“无效AES密钥长度:256字节”

有人知道我如何用这种特殊的方法运行加密吗? 这是可能的,还是我必须使用不同的方法

提前谢谢

//编辑-由于@ewramner而解决 //以下是工作解决方案:

publicstaticstringencodetext(字符串明文、公钥公钥)引发异常
{   
KeyGenerator=KeyGenerator.getInstance(“AES”);
generator.init(128);//AES密钥大小(以位为单位)
SecretKey secKey=generator.generateKey();
Cipher Cipher=Cipher.getInstance(“RSA/ECB/PKCS1Padding”);
cipher.init(cipher.PUBLIC_KEY,publicKey);
字节[]encSecKey=cipher.doFinal(secKey.getEncoded());
Cipher AESChipher=Cipher.getInstance(“AES”);
aesciper.init(Cipher.ENCRYPT_模式,secKey);
byte[]byteCipherText=aesciper.doFinal(plainText.getBytes());
返回Base64.getEncoder().encodeToString(encSecKey)+“#”+Base64.getEncoder().encodeToString(字节密文);
}
公共静态字符串decodeText(字符串密文、PrivateKey PrivateKey)引发异常
{
String[]split=cipherText.split(“#”);
字符串encSecKey=split[0];
字符串encText=split[1];
字节[]bytesSecKey=Base64.getDecoder().decode(encSecKey);
字节[]bytesText=Base64.getDecoder().decode(encText);
Cipher Cipher=Cipher.getInstance(“RSA/ECB/PKCS1Padding”);
cipher.init(cipher.PRIVATE_KEY,privateKey);
字节[]decSecKey=cipher.doFinal(bytesSecKey);
SecretKey secKey=newsecretkeyspec(decSecKey,0,decSecKey.length,“AES”);
Cipher AESChipher=Cipher.getInstance(“AES”);
aesciper.init(Cipher.DECRYPT_模式,secKey);
返回新字符串(aesciper.doFinal(bytesText));
}

我知道这是可能的,但我试图找到一种只需要私钥就可以解码的方法。摆脱硬编码的秘密。创建一个大小合适的随机AES密钥,并使用RSA密钥对其进行加密。然后用AES密钥加密纯文本。然后返回加密的AES密钥,后跟加密的纯文本。在使用base64时,可以使用base64中未使用的字符将两者分开。然后在解码端,拆分文本以获得加密密钥,并使用RSA私钥对其进行解密。使用解密后的AES密钥解密其余密码文本。感谢您的回答,我将尝试以下方法:)@ewramner如果有效,我将解决方案添加到初始帖子中,感谢againI知道这是可能的,但我试图找到一种只需要私钥解码的方法。摆脱硬编码的秘密。创建一个大小合适的随机AES密钥,并使用RSA密钥对其进行加密。然后用AES密钥加密纯文本。然后返回加密的AES密钥,后跟加密的纯文本。在使用base64时,可以使用base64中未使用的字符将两者分开。然后在解码端,拆分文本以获得加密密钥,并使用RSA私钥对其进行解密。使用解密后的AES密钥解密其余密码文本。感谢您的回答,我将尝试以下方法:)@ewramner如果有效,我将解决方案添加到初始帖子中,再次感谢