Java中的RSA加密..NET和.NET中的解密

本文关键字:NET 解密 Java RSA 加密 中的 | 更新日期: 2023-09-27 17:55:02

我的应用程序有Java和。net客户端,我的应用程序在。net中。我的客户端会发送给我一个用RSA公钥加密的XML文件我需要用。net

解密它

对于字符串"Achinth Anand Gurkhi",Java RSA加密方法生成以下加密字符串:

e8s2Ap3R1AwoaKB7OPCwkf0vhAVGaQisdoq2Yo0BvwcQ7v3oVtMOVc5wsnIyNVOSZV543imwIiBer0HSXRe8PoBD4jj0tTxtLA+bdoR40oQJD2UmZ4OpAH3g92wLXYd4bVvjllcCPPc0tSr/nzEKeZHcnhf6cGpuwfKyFNbXW2vtlEfmRd+LGqlixPRlx1OnsSMNNw+u/5IBs8MauY4Uwq1Lovlgd9f/8WTOvq9ityr84vGLMRGs4wpC7+fFNk8jGuNZgoCDLZw2RqrUd8FBFvN2wCRZXnS7Wg4QjiBdmnq0OsAwK9OFwqnil7DNnDnlytlecR5oYkDhO2fC4FzFiA==

对于相同的字符串,.NET RSA加密方法使用Java程序使用的相同公钥生成以下加密字符串:

iJO4hwhXGX27jzK87X9gxzzbKpgf7FKhe6UcY7eoiCpLskOatgCMZTm0aTDuwRZGJGbZCIZt+JI9X8LxwOLmIbv5LGyDq+a8jkrPu+pDRvg2uRuKeQj2yBRcp36X+xFf61ux24NaX2RTCY9YfJcUis9NjEkL0eQ3gC79xO0vuBjaUA2oYOt0Mlr7DmKE+b0lz25J/WJuSW83g2oZOlvJ4RnsrFChu0vHnkHCQo9JVjhMc+Onj7+lbI1CDgGq4XigZrHt+j564y3sc3z0oQYfdZkF3yUZrzd3sJjd9KmryHf52eVb9/qgL2/Za1jUwTzKIOvtG/bQpR2ka7Qu1ZqbxQ==

但是我的。net解密方法使用匹配的私钥能够将两者解密回相同的字符串"Achinth Anand Gurkhi"。不同的加密字符串怎么可能返回相同的值?

Java中的RSA加密..NET和.NET中的解密

这可能是因为随机填充。

在这种情况下,您可能很幸运,没有被这个问题所困扰(可能是因为您的示例文件只有一个块),但是您需要确保加密器和解密器的密码模式是相同的。

在。net中,密码模式由密码的Mode属性控制。在Java中,它由Cipher.getInstance()

transformation参数的第二和第三字段控制。

两个平台之间的默认模式也不同(. net中的CBC, Java中的ECB),如果你忽略了在任何一方设置模式,都可能会绊倒你。

您没有指定如何在每种情况下对它们进行加密,但是标准方法是生成一个随机对称密钥,用该密钥加密消息,然后用公钥加密对称密钥,并发送这两个密钥。因此,即使使用相同的代码,用相同的密钥加密相同的消息也总是会得到不同的结果。这是意料之中的,这是一个特性,而不是一个bug:这意味着攻击者也无法判断您是否多次发送相同的消息。

据我所知,公钥/私钥对是这样的:

对一个数据使用公钥加密。使用私钥解密。也就是说,公钥和私钥是互为逆的。

在通信通道之间,一端(source)与另一端(dest)共享公钥。现在源端使用私钥加密它的数据并发送给dest, dest使用源端共享的公钥解密。

原因:. net和JAVA的私钥是不同的,但是对应的公钥必须是各自私钥的逆。

这些密钥可以考虑主机名/ip/或任何(我不确定)来生成公钥/私钥对。
The public key encrytion needs two keys which are inverse of each other but not necessarily the encrypted data be same

的意见/建议吗?