【问题标题】:Exchange symmetric keys between client and server using public key使用公钥在客户端和服务器之间交换对称密钥
【发布时间】:2016-02-27 09:43:39
【问题描述】:

我希望在运行在 Java RMI 上的客户端和服务器程序之间交换对称密钥。

我的服务器生成了一个公钥:

KeyPairGenerator keyGen = null;
try {
    keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    e.printStackTrace();
}
KeyPair pair = keyGen.generateKeyPair();
this.priv = pair.getPrivate();
this.pub = pair.getPublic();

我将公钥发送给客户端。客户端将使用服务器的公钥生成密码。我想使用这个 Cipher 来加密封装客户端创建的对称密钥的 SealedObject 并将其发送到服务器。

//create cipher using server's public key
Cipher cipher = null;
try {
    cipher = Cipher.getInstance(serverKey.getAlgorithm(), "SUN");
} catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
} catch (NoSuchPaddingException e) {
    e.printStackTrace();
} catch (NoSuchProviderException e) {
    e.printStackTrace();
}
try {
    cipher.init(Cipher.ENCRYPT_MODE, serverKey);
} catch (InvalidKeyException e) {
    e.printStackTrace();
}

但是当我运行程序时,初始化密码时出现异常:

java.security.NoSuchAlgorithmException: No such algorithm: DSA
at javax.crypto.Cipher.getInstance(Cipher.java:646)
at javax.crypto.Cipher.getInstance(Cipher.java:568)
at Client.main(Client.java:91)

我不明白为什么会出现这个 NoSuchAlgorithm 异常。如果我用 RSA 而不是 DSA 制作公钥,我不会得到这个,但 RSA 给了我:

javax.crypto.IllegalBlockSizeException: 
Data must not be longer than 117 bytes

那么我应该使用什么来安全地发送包含我的对称密钥的密封对象?

【问题讨论】:

标签: java rmi public-key-encryption encryption-symmetric


【解决方案1】:

作为@zapl cmets,DSA 不是加密算法,RSA 只能加密大小小于密钥大小减去大部分固定开销的数据(PKCS1 为 11 个字节,这是您使用的默认值; OAEP 更多)。

虽然不在您发布的代码中,但我敢打赌,问题是您正试图密封 SecretKey 对象。加密仅适用于字节(或位)序列,在 Java 中由字节数组或有时部分数组表示,因此 SealedObject 实际上将您提供给它的对象序列化为字节并加密这些字节,并反过来解密这些字节并将它们反序列化为重新形成对象。 Java 序列化有一些开销,特别是各种Key 类型被组织在一个层次结构中,这加剧了这一点。例如,从 KeyGenerator.getInstance("TDES") 序列化 SecretKey 是 282 字节,对于 RSA-1024 来说太大了,因为您的例外说只能是 117 字节。

而是只密封SecretKey.getEncoded()获得的键值的字节。在接收器(服务器)上,将字节放回SecretKeySpec(使用正确的算法;如果没有提前修复,也可以发送),您实际上可以将其用作Key,以实现对称,即使不通过工厂运行它(与具有更多结构的非对称密钥不同)。即使是简单的byte[] 也有一些序列化开销,但不足以在此处引起问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2014-09-15
    相关资源
    最近更新 更多