Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RSA加密-解密.NET_Java_.net_Rsa_Encryption Asymmetric - Fatal编程技术网

Java RSA加密-解密.NET

Java RSA加密-解密.NET,java,.net,rsa,encryption-asymmetric,Java,.net,Rsa,Encryption Asymmetric,我使用RSA在JAVA上加密,并尝试使用.NET解密。我将我的JAVA代码和.NET代码包括在内,希望有人对这类事情有一些经验 JAVA代码: byte[] modulusBytes = Base64.decode("xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguC

我使用RSA在JAVA上加密,并尝试使用.NET解密。我将我的JAVA代码和.NET代码包括在内,希望有人对这类事情有一些经验

JAVA代码:

byte[] modulusBytes = Base64.decode("xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=");
byte[] exponentBytes = Base64.decode("AQAB");
BigInteger modulus = new BigInteger(1, modulusBytes );
BigInteger exponent = new BigInteger(1, exponentBytes);

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(rsaPubKey);

Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] plainBytes = new String("big kitty dancing").getBytes("UTF-8");
byte[] cipherData = cipher.doFinal( plainBytes );
String encryptedString = Base64.encodeBytes(cipherData);
从这段JAVA代码中,我得到encryptedString的结果,它恰好是:

FoP4+AAIH6hcabXnrvNG5YUk/NBV9N9HU0CAGZJKIWQIDJBOPSWOPVBFERRZ6641X2QAOJ5YV18XAAY+0WrCaSw4sveRX+hmPm5qeVUPcjoR4slsVZ/HBFJTAHJ9TVA4HOUGWDZA9RvJLXKNFE+u+Kt/YKLOI2YBH05HJEM=

并尝试使用以下.NET代码解密

const int PROVIDER_RSA_FULL = 1;
const string CONTAINER_NAME = "Tracker";

CspParameters cspParams;
cspParams = new CspParameters(PROVIDER_RSA_FULL);
cspParams.KeyContainerName = CONTAINER_NAME;
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(cspParams);
rsa1.FromXmlString("<RSAKeyValue><Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus><Exponent>AQAB</Exponent><P>+lXMCEwIN/7+eMpBrq87kQppxu3jJBTwztGTfXNaPUTx+A6uqRwug5oHBbSpYXKNDNCBzVm/0VxB3bo4FJx+ZQ==</P><Q>yasOGaJaE9xlF9T2xRuKeG9ZxCiyjhYaYB/mbtL+SIbtkRLi/AxaU4g2Il/UxhxhSXArKxIzV28zktispPJx1Q==</Q><DP>ueRgQIEFUV+fY979a1RgrVHIPpqEI1URhOMH3Q59oiXCcOumM5njyIHmWQxRAzXnG+7xlKXi1PrnRll0L4oOKQ==</DP><DQ>dfEMNgG1HJhwpxdtmqkYuoakwQvsIRzcIAuIAJh1DoWaupWJGk8/JEstHb1d+t7uJrzrAi2KyT/HscH2diE0YQ==</DQ><InverseQ>YoYF9PF6FiC0YngVeaC/eqt/ea8wMYNN3YO1LuzWpcy2exPRj2U0ZbWMvHXMUb4ea2qmhZGx1QlK4ULAuWKpXQ==</InverseQ><D>g1WAWI4pEK9TA7CA2Yyy/2FzzNiu0uQCuE2TZYRNiomo96KQXpxwqAzZLw+VDXfJMypwDMAVZe/SqzSJnFEtZxjdxaEo3VLcZ1mnbIL0vS7D6iFeYutF9kF231165qGd3k2tgymNMMpY7oYKjS11Y6JqWDU0WE5hjS2X35iG6mE=</D></RSAKeyValue>");

string data2Decrypt =    "FoP4+AAIH6hcabXnrvNG5YUk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay+0WrCaSw4sveRX+hmPm5qeVUPcjoR4slsVZ/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE+u+Kt/YKLOi2EYbH05HjeM=";

byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt);  

byte[] plain = rsa1.Decrypt(encyrptedBytes, false);
string decryptedString = System.Text.Encoding.UTF8.GetString(plain);
const int PROVIDER\u RSA\u FULL=1;
const string CONTAINER_NAME=“Tracker”;
csp参数csp参数;
cspParams=新的CspParameters(提供程序\u RSA\u已满);
csParams.KeyContainerName=容器名称;
RSACryptServiceProvider rsa1=新的RSACryptServiceProvider(CSParams);
rsa1.FromXmlString("4.一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个4+一个8+一个8+一个8+一个8+一个8+一个8+一个8(8+一个8+一个8+一个非非4级(8)的8 8 8 8个8 8 8个非非非非非10级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8级的8 SIbtkRLi/AxaU4g2Il/UXHXHSARKXIZV28ZKT研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,在2009年10月1日,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果表明,该文的研究结果是一文的一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分,一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一部分是一kqxpxwqazlw+VDXfJMypwDMAVZe/SQZSJNFETZXJDXAEO3VLCZ1MNBIL0VS7D6IFEYUTF9KF231165QGD3K2TGIMP7OYKJS11Y6JQWDU0WE5HJS2X35IG6ME=“”);
字符串data2Decrypt=“FoP4+aaihcabxnrvng5yuk/nBv9n9HU0CAgZjkIWQIDjbOpSwoPVBFERrZ6641x2QaoJw5yv18XAay+0WrCaSw4sveRX+hmpm5qevupjor4slsvz/hBFJtAHj9tva4hOugWDZa9s3RVJlxkNfE+u+Kt/YKLOi2EYbH05HjeM=”;
byte[]encyrptedBytes=Convert.FromBase64String(data2Decrypt);
byte[]plain=rsa1.解密(encyrptedBytes,false);
string decryptedString=System.Text.Encoding.UTF8.GetString(普通);

在Java端,您需要使用
“RSA/ECB/PKCS1Padding”
作为算法名称。使用普通的
“RSA”
名称,Java不会添加C#实现期望的填充,因此会出现“坏数据”


填充是将输入数据(您的编码字符串)转换为一个稍大的字符串,该字符串的长度与RSA模数(此处为128字节)相同。这对于安全性很重要,并且会带来一些随机性(同一个输入字符串不会每次都产生相同的加密字符串;但解密过程会消除这种随机性并恢复正确的字符串)。

哦,我收到的错误是“坏数据”嗨@badMonkey,我有一个问题。你从哪里得到XML的?我没有得到那部分,它有很多参数(Q,P,DP,DQ,InverseQ,D).我的java同事正在加密一个文本,而C#developer恰好是我,他应该解密它。他给了我模数和指数,我怎么能只用模数和指数来解密加密的字符串呢?我不太确定哪一个是哪一个,但我很确定这位先生的这段精彩的说明性视频解释了those我在上一篇评论中问过的问题。祝你好运。总是用Java显式定义模式和填充,因为没有保证在不使用时会使用什么。我想知道C#/.NET是否有一些等价物?Thomas我希望当我遇到加密问题时,你总是在身边!这绝对解决了问题。laz-RSACryptoServiceProvider.KeyExchangeAlgorithm是您设置的属性。默认值(正如Thomas Pornin指出的)是“RSA-PKCS1-KeyEx”。否。如果您指定Cipher.getInstance(“RSA”),您会得到“RSA/ECB/PKCS1Padding”。Greg我没有看到这种行为。当我实现一个更改时,Thomas建议在.net端将数据取消键入OK。”RSA-PKCS1-KeyEx”是.net端的算法名称。