java – 使用具有给定模数和指数的RSA算法在Android中加密
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用具有给定模数和指数的RSA算法在Android中加密,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2871字,纯文字阅读大概需要5分钟。
内容图文
![java – 使用具有给定模数和指数的RSA算法在Android中加密](/upload/InfoBanner/zyjiaocheng/793/90ac9b984bb740b2af5f0df02903a639.jpg)
我之前在C#中使用过RSACryptoServiceProvider来加密某些数据,现在我必须在Android程序中复制这种加密.我希望我的Android程序生成与我在C#程序中获得的结果相同的结果.
公钥:
<RSAKeyValue>
<Modulus>zz4qdc39y1BHyJgVXUkINJSbsUd1ZJPISyE9nNGjqgR+ZO1a4cE3ViVCSZCw+6dBdVMFNjzZPBxl0mT57GIq7rcuoT0scesZgxOftbMasPbxp0BGrh3HTpbBMJdCopgcYV98CZERakb8Pgbb0ne/DiW9Aq0kfTBE02/iEHRNuqMNfo1GFo55m0OKbxVoM6UBb8AITQ6lbdvfCgeIvMzRlVrHCwxUNrrX5cS6gurEfJ8Da+prKQmwWpFCkwDkPWje2W+bTSPUc9l6Ads0UimYE5sGs4Zsfz6Eocz4rJjR+qCiB8qt6HtdyjKo0auqYzyXIjdRv2950flc9tOh5bRlQQ==
</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>
Java加密程序:
byte[] modulusBytes = Base64.decode(Modoutput.getBytes("UTF-8"),
Base64.DEFAULT);
byte[] exponentBytes = Base64.decode(Expoutput.getBytes("UTF-8"),
Base64.DEFAULT);
BigInteger e = new BigInteger(1, exponentBytes);
BigInteger m = new BigInteger(1, modulusBytes);
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKeyn = fact.generatePublic(keySpec);
Log.i("Publickey", pubKeyn.toString());
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, pubKeyn);
byte[] encryptedByteData = cipher.doFinal(byteData);
String outputEncrypted = Base64.encodeToString(encryptedByteData,
Base64.NO_WRAP);
Log.i("Encrypteddata", outputEncrypted);
我尝试了上面的代码,但它提供了与C#完全不同的输出.谁能告诉我我的代码有什么问题?提前致谢.
编辑:根据要求,这是我试图在Java中复制加密输出的C#代码:
public static string EncryptText(string text, int keySize,
string publicKeyXml) {
var encrypted = Encrypt(Encoding.UTF8.GetBytes(text), keySize,
publicKeyXml);
return Convert.ToBase64String(encrypted);
}
public static byte[] Encrypt(byte[] data, int keySize, string publicKeyXml) {
if (data == null || data.Length == 0)
throw new ArgumentException("Data are empty", "data");
int maxLength = GetMaxDataLength(keySize);
if (data.Length > maxLength)
throw new ArgumentException(String.Format(
"Maximum data length is {0}", maxLength), "data");
if (!IsKeySizeValid(keySize))
throw new ArgumentException("Key size is not valid", "keySize");
if (String.IsNullOrEmpty(publicKeyXml))
throw new ArgumentException("Key is null or empty", "publicKeyXml");
using (var provider = new RSACryptoServiceProvider(keySize)) {
provider.FromXmlString(publicKeyXml);
return provider.Encrypt(data, _optimalAsymmetricEncryptionPadding);
}
}
解决方法:
根据定义,加密会尝试隐藏有关纯文本的所有信息.这包括有关相同纯文本的信息.为此,它在各种填充模式中使用某种随机(例如,对于RSA,PKCS#1 v1.5兼容填充或OAEP填充).从加密的角度来讲,如果你得到相同的结果,实现就会被打破.
检查密文是否正确的方法是使用私钥解密密文.如果这导致您开始使用的纯文本,那么您的实现是正确的.
[编辑]请注意,您在C#代码中使用OAEP加密,而Java默认使用PKCS#1 v1.5兼容方案.您应该使用“RSA / None / OAEPWithSHA1AndMGF1Padding”或“RSA / ECB / OAEPWithSHA1AndMGF1Padding”.如果没有,请添加Bouncy Castle提供商.
内容总结
以上是互联网集市为您收集整理的java – 使用具有给定模数和指数的RSA算法在Android中加密全部内容,希望文章能够帮你解决java – 使用具有给定模数和指数的RSA算法在Android中加密所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。