gpt4 book ai didi

java - 为什么我的服务器 (Go) 无法解密客户端 (Java) 消息?

转载 作者:IT王子 更新时间:2023-10-29 02:12:07 26 4
gpt4 key购买 nike

目前,我正在研究一些套接字的东西,以建立一个简单的加密聊天。服务器是用 Go 编写的,客户端是用 Java 编写的。我的服务器和客户端已经在工作并且可以通信。我的下一个目标是加密客户端和服务器之间的流量。

我想使用 RSA 和 AES 来加密将在两个目标之间传输的所有数据。当客户端连接时,服务器会将他的公共(public) RSA key 发送给客户端,客户端将加密他的 AES key 并将其发送回服务器。

现在的主要问题是,我无法解密客户端发回服务器的内容。我已经比较了加密数据,并尝试了我的加密/解密方法是否可以正常工作。他们做到了。但是一旦到了客户端使用公钥加密而服务器必须使用私钥解密的地步,它就无法工作了。

这是生成新 RSA key 对的服务器代码:

func GenerateKeyPair() RSAKeyPair {
log.Println("Generating RSA keys. This could take a while.")

startTime := time.Now()

privateKey, err := rsa.GenerateKey(rand.Reader, 1024)
if err != nil {
log.Fatal("Couldn't generate RSA keys. Message: ", err)
os.Exit(1)
}

var publicKey *rsa.PublicKey
publicKey = &privateKey.PublicKey

elapsedTime := time.Since(startTime)
log.Printf("RSA keys ready afert %s.", elapsedTime)

return RSAKeyPair{Private: *privateKey, Public: *publicKey}
}

这是表示 RSAKeyPair 的结构

type RSAKeyPair struct {
Private rsa.PrivateKey
Public rsa.PublicKey
}

这是解密字符串的服务器端函数:

func DecryptStringRSA(s string, key rsa.PrivateKey) string {
b64Bytes, _ := base64.StdEncoding.DecodeString(s)
sDecrypted, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, &key, []byte(s), nil)
if err != nil {
log.Println("Decryption error: ", err)
return ""
} else {
return string(sDecrypted[:])
}
}

我在客户端使用 Bouncy CaSTLe。服务器将公钥作为 Base64 解码字符串(现在是人类可读的)发送,客户端将字符串转换为 AsymmetricKeyParameter。这种转换也可以正常工作,我检查过。

客户端加密字符串的方法:

public String encryptString(String string, AsymmetricKeyParameter publicKey) throws UnsupportedEncodingException, InvalidCipherTextException {
Security.addProvider(new BouncyCastleProvider());
RSAEngine rsaEngine = new RSAEngine();
AsymmetricBlockCipher blockCipher = new OAEPEncoding(rsaEngine, new SHA256Digest(), new SHA256Digest(), null);
blockCipher.init(true, publicKey);

byte[] bytes = string.getBytes("UTF-8");
byte[] encryptedBytes = blockCipher.processBlock(bytes, 0, bytes.length);
return Base64.getEncoder().encodeToString(encryptedBytes);
}

在客户端加密一个字符串并将其发送回服务器后,服务器应该解密它并继续做他应该做的事情但是相反,它只是给我以下错误:

crypto/rsa: decryption error

同样,这是我检查过的,什么是好的:

  • key 转换为字符串并提交给客户端
  • 从字符串到 AsymmetricKeyParameter 的 key 转换
  • 编码
  • 加密/解密在一个站点上工作(客户端 <-> 客户端和服务器 <-> 服务器

简而言之,什么不起作用:

  • 解密来自客户端的字符串

也许我没有看到一个非常小的错误,或者只是完全忘记了一些事情。我认为有一些聪明的人可以告诉我哪里出了问题或给我提示。如果您需要更多代码示例或其他信息,请随时询问。

编辑:我检查了加密字符串以确保服务器接收到客户端发送的相同字符串。这是两个加密字符串:

客户:

GnUapW7dxa3zXwVzNAVOJs6lcfeb6Nv0OKDM8QvPMb9jqozsGYdlET09D2Nc9F7bMfVbBMeLujlxwu8NqbvYABpoYd7uwRZJfEh/VexIEbsdkVxQUr+PEvBlE/ekkSJIV9ymCVllmRForvq7WU3pva9e56owp1NdVJGFVYVKbp8=

服务器:

GnUapW7dxa3zXwVzNAVOJs6lcfeb6Nv0OKDM8QvPMb9jqozsGYdlET09D2Nc9F7bMfVbBMeLujlxwu8NqbvYABpoYd7uwRZJfEh/VexIEbsdkVxQUr+PEvBlE/ekkSJIV9ymCVllmRForvq7WU3pva9e56owp1NdVJGFVYVKbp8=

在我看来,它们看起来是一样的,所以这应该不是问题所在。此外,客户端和服务器都使用带有 SHA256 的 OAEP。

提前感谢大家的帮助!

最佳答案

您正在解密 base64 编码的字符串“s”,而不是“b64Bytes”。虽然您的代码没有编译,所以这可能不是实际代码?这是一个编译解决方案:

func DecryptStringRSA(s string, key rsa.PrivateKey) string {
b64Bytes, _ := base64.StdEncoding.DecodeString(s)
sDecrypted, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, &key, b64Bytes, nil)
if err != nil {
log.Println("Decryption error: ", err)
return ""
} else {
return string(sDecrypted[:])
}
}

关于java - 为什么我的服务器 (Go) 无法解密客户端 (Java) 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43330545/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com