所以我最近看到来自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)
当然这只是一个测试用例。