Java 使用非对称加密时出现IllegalBlockSize异常(公钥-私钥Enc)

Java 使用非对称加密时出现IllegalBlockSize异常(公钥-私钥Enc),java,encryption,rsa,private-key,encryption-asymmetric,Java,Encryption,Rsa,Private Key,Encryption Asymmetric,我在Java中设置了公钥和私钥加密,并分发了两个用户的公钥(通信是在两个用户之间进行的)。我现在希望用户交换对称密钥。我应该做的是: 用户A生成一个密钥 用户A用他的私钥加密密钥,然后用B的公钥加密 用户A发送加密密钥 用户B接收加密密钥 用户B先用他的私钥,然后用A的公钥解密密钥 用户A生成密钥的我的代码: 1. KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCMETHOD); 2. SecureRandom secureRand

我在Java中设置了公钥和私钥加密,并分发了两个用户的公钥(通信是在两个用户之间进行的)。我现在希望用户交换对称密钥。我应该做的是:

  • 用户A生成一个密钥
  • 用户A用他的私钥加密密钥,然后用B的公钥加密
  • 用户A发送加密密钥
  • 用户B接收加密密钥
  • 用户B先用他的私钥,然后用A的公钥解密密钥
  • 用户A生成密钥的我的代码:

    1. KeyGenerator keyGenerator = KeyGenerator.getInstance(ENCMETHOD);
    2. SecureRandom secureRandom = new SecureRandom();
    3. int keyBitSize = 128;
    4. keyGenerator.init(keyBitSize, secureRandom);
    5. secretKey = keyGenerator.generateKey();
    6. encodedKey = Base64.getEncoder().encodeToString(secretKey.getEncoded());
    
    // encrypt with public key of B and then my private key
    7. String encryptedMessage = encodedKey;
    8. encryptedMessage = ac.encryptText
                   (
                            ac.encryptText(encryptedMessage, otherUserPublickey),
                            privateKey
                    );
    
    第8行抛出以下错误:

    javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 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 driver.AsymmetricCryptography.encryptText(AsymmetricCryptography.java:73) // please refer to the code section below for this method
        at driver.ClientOne.main(ClientOne.java:158) // this is line 8 in the above code
    
    方法AsymmetricCryptography.encryptText(字符串消息,私钥):


    非常感谢您的帮助。谢谢。

    看起来您的数据量超过了使用RSA加密的数据量(请参见此处),RSA本质上是模数大小,可能是因为Base64编码。

    用户A用他的私钥加密密钥,然后用B的公钥加密…
    这根本不起作用,可能不是确保密钥真实性的合理方法。谢谢您的回复。你能更具体地解释一下为什么这行不通吗?用户A使用其私钥加密可确保不可否认性,而使用用户B的公钥加密可确保只有B能够读取消息(如果我是对的)。如果您想识别/验证用户,这是一件事。如果要对数据进行签名,请使用签名协议。如果要加密数据,请使用混合加密协议。但是相反,你推出了自己的计划,但并不清楚它的目标是什么,并立即陷入了下面由@David Soroko概述的问题。
    public String encryptText(String msg, PrivateKey key)
            throws
            UnsupportedEncodingException, IllegalBlockSizeException,
            BadPaddingException, InvalidKeyException {
            this.cipher.init(Cipher.ENCRYPT_MODE, key);
            return Base64.encodeBase64String(cipher.doFinal(msg.getBytes("UTF-8")));
    }
    
    // this.cipher = Cipher.getInstance("RSA");