首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RSA的Android加密方法中的无效密码字节

使用RSA的Android加密方法中的无效密码字节
EN

Stack Overflow用户
提问于 2014-06-21 07:57:42
回答 1查看 449关注 0票数 0

当我们试图在Android中加密数据并在WCF服务中解密数据时,我们面临着一个问题。用于加密数据的Android代码如下:

代码语言:javascript
复制
try{
String strModulus = "tr82UfeGetV7yBKcOPjFTWs7pHqqr/5YKKWMUZ/HG4HnCmWrZsOhuR1FBnMZ/g2YiosoSlu0zd7Ukz9lX7wv2RLfWXfMvZYGpAAvfYWwzbyQ2i1q+tKE/thgKNscoSRellDD+uJcYn1H4hnaudVyYJH9miVhOKhKlExMzw8an6U=";
String strExponent = "AQAB";
byte[] modulusBytes = Base64.decode(strModulus, Base64.DEFAULT);
byte[] exponentBytes = Base64.decode(strExponent, Base64.DEFAULT);

BigInteger modulus = new BigInteger(1, modulusBytes );               
BigInteger exponent = new BigInteger(1, exponentBytes);

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent);
KeyFactory fact = KeyFactory.getInstance("RSA/ECB/PKCS1Padding");
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.DEFAULT);
}
catch(Exception e){
Log.e("Error", e.toString());
}

return encryptedString;

Java中的相同代码:

代码语言:javascript
复制
try{
        String strModulus = "tr82UfeGetV7yBKcOPjFTWs7pHqqr/5YKKWMUZHG4HnCmWrZsOhuR1FBnMZ/g2YiosoSlu0zd7Ukz9lX7wv2RLfWXfMvZYGpAAvfYWwzbyQ2i1q+tKE/thgKNscoSRellDD+uJcYn1H4hnaudVyYJH9miVhOKhKlExMzw8an6U=";
        String strExponent = "AQAB";
        byte[] modulusBytes = DatatypeConverter.parseBase64Binary("tr82UfeGetV7yBKcOPjFTWs7pHqqr/5YKKWMUZ/HG4HnCmWrZsOhuR1FBnMZ/g2YiosoSlu0zd7Ukz9lX7wv2RLfWXfMvZYGpAAvfYWwzbyQ2i1q+tKE/thgKNscoSRellDD+uJcYn1H4hnaudVyYJH9miVhOKhKlExMzw8an6U=");
        byte[] exponentBytes = DatatypeConverter.parseBase64Binary("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/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);

        byte[] plainBytes = new String("Manchester United").getBytes("UTF-8");
        byte[] cipherData = cipher.doFinal(plainBytes);
        //String encryptedString = Base64.encodeToString(cipherData, Base64.NO_PADDING);
        String encryptedString = DatatypeConverter.printBase64Binary(cipherData);
        String encryptedData = encryptedString;
    }
    catch(Exception e){
    }       
}

周转基金服务:

公共字符串解密(){ const int PROVIDER_RSA_FULL = 1;const string CONTAINER_NAME = "Tracker";CspParameters cspParams;cspParams =新CspParameters(PROVIDER_RSA_FULL);cspParams.KeyContainerName = CONTAINER_NAME;RSACryptoServiceProvider rsa1 =新RSACryptoServiceProvider(cspParams);CONTAINER_NAME字符串data2Decrypt = "LyVNDhkdJ5jNgwZDiVZ1R0lmd10AQgqNDFHh2vJB1676eg8wj0MOdTyChAGrvEjha0uXg+f/aNBAc4+/LFbCgsA1e+O3wnXr27sXznGJ9G15avZzQHG4JWUS42MXBahAkcJ80pcihTbL9edfQCkEuj9RzQ/zFJyDEMssfd/EPDM=";byte[] encyrptedBytes = Convert.FromBase64String(data2Decrypt);byte[] plain =rsa1.DecUpt(encyrptedBytes,false);string decryptedString =Systemt.ext.Encoding.UTF8.GetString(平原);}

原始数据:‘曼彻斯特联队’

奇怪的是,如果我用Java代码加密字符串,它可以在WCF服务端解密,但是,如果使用上述Android代码加密,则解密将提供错误:“要解密的数据超过此128字节模数的最大值”。

在调试过程中,我意识到安卓和Java的byte[] cipherData是不同的。所有以前的值碰巧是同步的。这会在Java和Android中生成不同的加密字符串。

我的问题是为什么会发生这种事?有愚蠢的错误吗?有办法解决这个问题吗?或者在Android中可以做些什么来获得“密码数据”,对吗?

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2014-06-21 10:35:31

您在Android上使用的是不同的填充。在Android上也使用完全相同的填充:

代码语言:javascript
复制
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24339608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档