我是Android開發人員。目前的任務是使用RSA算法通過提供給我的公鑰模數和指數對我的Android應用程序中的數據進行加密,然後通過網絡通過JSON字符串將其發送到.Net Web服務。該Web服務將解密數據並進一步使用它。在Android中加密數據和在WCF Web服務中解密數據時,要解密的數據超過128個字節的最大模數
,我用它來加密數據的代碼如下:
public String RSAEncrypt (final String plain) throws Exception
{
try{
String strModulus = "tr82UfeGetV7yBKcOPjFTWs7pHqqr/5YKKWMUZ/HG4HnCmWrZsOhuR1FBnMZ/g2YiosoSlu0zd7Ukz9lX7wv2RLfWXfMvZYGpAAvfYWwzbyQ2i1q+tKE/thgKNscoSRellDD+uJcYn1H4hnaudVyYJH9miVhOKhKlExMzw8an6U=";
String strExponent = "AQAB";
byte[] modulusBytes = strModulus.getBytes();
byte[] exponentBytes = strExponent.getBytes();
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/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] plainBytes = new String("Manchester United").getBytes("UTF-8");
byte[] cipherData = cipher.doFinal(plainBytes);
encryptedString = Base64.encodeToString(cipherData, Base64.NO_PADDING);
}
catch(Exception e){
Log.e("Error", e.toString());
}
return encryptedString;
}
上面的代碼給了我,我傳遞給.NET Web服務的字符串。但由於某種原因,Web服務無法正確解密這些數據,並出現錯誤: 要解密的數據超過128個字節的最大模數
我試圖幫忙,但我無法理解什麼正在發生。
我在我的代碼中做了如下修改: Cipher cipher = Cipher.getInstance(「RSA/ECB/PKCS1Padding」);而不是 密碼cipher = Cipher.getInstance(「RSA」);
在加密數據時還提供了'Base64.NO_PADDING'。
的ASP.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>tr82UfeGetV7yBKcOPjFTWs7pHqqr/5YKKWMUZ/HG4HnCmWrZsOhuR1FBnMZ/g2YiosoSlu0zd7Ukz9lX7wv2RLfWXfMvZYGpAAvfYWwzbyQ2i1q+tKE/thgKNscoSRellDD+uJcYn1H4hnaudVyYJH9miVhOKhKlExMzw8an6U=</Modulus><Exponent>AQAB</Exponent><P>6e0nv7EBFBugtpoB+ozpg1J4js8E+DVyWCuBsERBPzqu4H7Z/oeLIRSC8Gi5GZgrCpBf3EvyIluM7rzaIfNThQ==</P><Q>x/29X9ns1WcXC42IJjLDjscz5ygdVh79dm8B2tQVbqwyhDsQ6OIOQdu5+eHf4hUMoTrM9KkS2F6FGlLXuaOFoQ==</Q><DP>kTS2LMaJ/dpce5zDx6w6s1q5HSSiWBSNIu/2s9zah448yXvUg6vNkD40PVk0NRAA/7C44H2AExWzOOqfmN17JQ==</DP><DQ>xtAx9drQPWnpl/uQUOEAVa0kpPTVDStrr9Q1FNTnpYkcAyYw7kLkB4anAIoSpk9kqdeprsNxz5VPXtbiTFMKYQ==</DQ><InverseQ>O0594NMjnjSp+/NAa1kQxoQNzn1qqq+p1Zb+kT3/jRc/0d7ZnqSSpxFMXfxx3yZkNAOPDOdbckPQbRZ13RKBHg==</InverseQ><D>bjVEagwvkrZaTt9CTW1hd3362weLFlX6DpE/3R3RcrpVfkSwKGpEhqGrNeeGPlsuqiaf5rAFir4eTqrF1QVliKsU4XE0RyzP5lHGc7dlX4DOHMjs2R9nNWv8QOTPoaRuLrLGorqBXlw/jQPxFI6gQzkIIjzuf//lDVnFam3dw4E=</D></RSAKeyValue>");
string data2Decrypt = "SeuUUjdSbFQlcwaCFVZ9fN0t3aXpItXU4+pkuztVgky77SBokBATKj+56+irtCfT1lSGRZbbzgQTd8zpcjPsT6J+7AyBwRwuv418JyKINNxPsDVFKfupViu8MOoxWzjmjZE5p54AjByA6dzGSR9UogFHhFSMZWJ5OELwZFSz5wFHyMaeIm1UnEiRDDjPTY/aIuh56WnZPXUmP3D54bAwDXPFtY0JjjiyxZetnA";
byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt);
byte[] plain = rsa1.Decrypt(encyrptedBytes, false);
string decryptedString = System.Text.Encoding.UTF8.GetString(plain);
發生該錯誤的位置: 字節[]平原= rsa1.Decrypt(encyrptedBytes,FALSE);
Decrypt是.Net本身的RSACryptoProvider類的一個函數。
我已經檢查像幾個環節: The data to be decrypted exceeds the maximum for this modulus of 128 bytes. RSA DECRYPTION c#
The data to be decrypted exceeds the maximum for this modulus of 128 bytes
不過,我不能夠實現的建議。任何幫助將不勝感激。謝謝!
這是一個真正的好方案。這應該適用於我。唯一的問題是,Android不讓我使用'DatatypeConverter.parseBase64Binary',我不得不使用'Base64.decode()',它不提供所需的輸出。我試圖導入'javax.xml.bind.DatatypeConverter'的包,但無法正確實現。我很抱歉,但還有什麼可以滿足我的需求嗎? – Bot
兩個Base64解碼器都應該產生相同的輸出,所以問題出在Base64.decode上,而不是加密上。看到我上面的編輯。 –
此代碼在Java中完美工作。但在Android中不太好。在WCF中,當我解密使用Java代碼加密的字符串時,我得到了正確的值,但是我得到了Android的錯誤。問題是'byte [] cipherData'對於Java和Android來說是不一樣的。我似乎無法理解爲什麼。 – Bot