java - 私钥解密对称 key ,但对称 key 联网时给出不同的结果?

标签 java networking encoding utf-8 rsa

我正在使用 RSA 和 RC4 开发一个小型身份验证方案。目前,我正在尝试将随机生成的 session key 发送到客户端,并使用客户端的公钥进行加密。从那里,客户端将读取 session key ,并使用其私钥对其进行解密,然后将哈希值发送回服务器(我不会讨论更精细的安全机制,因为它们不是问题的一部分)。

目前,我已经确认服务器拥有与客户端公钥相同的副本。我知道服务器正在使用客户端的公钥加密随机生成的 session key 。所以[很可能]没有问题。

我认为问题在于 key 的转移。键是 String 类型,并按如下方式初始化 -

String sessionKey = new BigInteger(128, server.random).toString(128);

并使用 DataOutputStream 传输到客户端 -

o.writeUTF(this.encryptedSessionKey);

encryptedSessionKey是一个普通的字符串,没有特定的编码。我想也许在解密时 Java modified UTF-8编码, session key 格式错误。我这样解密 -

this.sessionKey = new String(cryptUtil.rsaDecrypt(clientPrivateKey, this.encryptedSessionKey.getBytes())); 
// Where encryptedSessionKey is read from the stream using i.readUTF();

对以 Java 修改的 UTF-8 编码的字符串(从 DataInputStream.readUTF() 读取)使用 String.getBytes() 是否会返回与没有特定编码实例化的字符串不同的数据?

最佳答案

我的猜测是你正在做这样的事情:

byte[] encryptedSessionKeyAsBytes = cipher.doFinal(...);
String encryptedSessionKey = new String(encryptedSessionKeyAsBytes);

这是错误的。 String 构造函数使用默认平台编码将字节转换为字符。并且所有字节序列都不能转换为字符。例如,如果您的默认编码是 ASCII,则所有负字节都无法转换为字符。

如果必须传输二进制数据,则将其作为字节传输(使用 byte[] 类型),或使用 Base64 将字节转换为可打印的字符,并使用 ASCII、ISO-8859-1 或 UTF 的写入器-传输 Base-64 字符串的任何编码。

关于java - 私钥解密对称 key ,但对称 key 联网时给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8641069/

相关文章:

java - 检查 2 个(或更多)EditTexts 是否为空

python - 使用 python 重命名文件时出现问题,某些字符拒绝更改。(可能是更改编码时出现问题)

Java错误子串

java - 使用 objectInputStream 读取时出现 EOFException

java - 如何将随机整数存储到类的实例中

mysql - 非英语脚本中的数据在 MySQL 中显示为 "??"

ios - 当我在 XCode iOS 中触发推送通知时出现奇怪的字符

c# - TcpClient - 等待数据可用

c - HTTP服务器如何使用tcp原始套接字检测和处理非http消息

perl - 如何判断网页是否存在?