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

时间:2017-09-13 20:02:47

标签: java encryption kotlin aes rsa

所以我最近看到来自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)

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

0 个答案:

没有答案