Java / Kotlin使用私钥和公钥加密AES密钥

所以我最近看到一个来自computerphile的视频,他们说当使用加密时,你应该使用AES密钥并用公钥和私钥对这个密钥进行加密。 这意味着:我有一个别人的公钥和我自己的私钥。

使用你自己的私钥加密它的原因是,这验证了消息必须来自我,因为没有其他人拥有我的私钥,所以使用我的公钥加密只能处理来自我的消息。

问题是,我第一次加密后,字节数组outcomming变得太长,我不能再加密它。 有没有解决的办法?

这是我的代码:

val aKey = generateAESKey() val kG = KeyPairGenerator.getInstance("RSA") kG.initialize(2048) val own = kG.genKeyPair() val strange = kG.genKeyPair() String(aKey.encoded).encryptRSA(strange.public).encryptRSA(own.public) fun generateAESKey(): Key { val generator = KeyGenerator.getInstance("AES") generator.init(128) return generator.generateKey() fun String.encryptRSA(key: Key): String { val encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") encryptCipher.init(Cipher.ENCRYPT_MODE, key) val cipherText = encryptCipher.doFinal(this.toByteArray(charset("UTF- 8"))) return String(cipherText) } fun String.decryptRSA(key: Key): String { val bytes = this.toByteArray() val decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") decryptCipher.init(Cipher.DECRYPT_MODE, key) return String(decryptCipher.doFinal(bytes), charset("UTF-8")) } 

这例如给我以下错误:

 Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344) at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) at javax.crypto.Cipher.doFinal(Cipher.java:2165) at de.intektor.kentai_http_common.util.EncryptionKt.encryptRSA(encryption.kt:30) at de.intektor.test.TestKt.main(Test.kt:19) 

当然这只是一个测试用例。