当前位置: 首页 > 知识库问答 >
问题:

JavaRSA加密

尹善
2023-03-14

我在C#程序(我在下面提到)中使用了RSA非对称密钥加密算法,我必须通过java程序加密数据。我希望我的java程序生成与C#程序相同的加密密钥。

公钥:

<RSAKeyValue>
<Modulus>zgfXY1oUe4nyndX4qtobP1BMxtJ1/rfKU5csdAcWrSVu6ZaEAX3rL3cWnaSLzX4E1BNjSP9pjge6TH7UoaWqOQ==</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>

C#加密程序:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

 rsa.FromXmlString(PublicKey); // read public key XML defined above

byte[] buffer = rsa.Encrypt(Encoding.UTF8.GetBytes(strToEncrypt), false);

string encryptedStr = HttpUtility.UrlEncode(buffer);// byteConverterGetString;

Java加密方案:

byte[] modulusBytes = Base64.decode("zgfXY1oUe4nyndX4qtobP1BMxtJ1/rfKU5csdAcWrSVu6ZaEAX3rL3cWnaSLzX4E1BNjSP9pjge6TH7UoaWqOQ==");
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/ECB/PKCS1Padding");

cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] plainBytes = new String("Admin123").getBytes("UTF-8");

byte[] cipherData = cipher.doFinal( plainBytes );

String encryptedString = Base64.encodeBytes(cipherData);

System.out.println(URLEncoder.encode(encryptedString));

我尝试了上述java程序,但结果如下:

O+gw 7+X hY x A 9 ltD V 5 zE RsF 4 Dy Xg MTc/gx 82 wR tT 1 x fR 3 su Y 0 XB JLa dp 7 bX j mSX 7 Cp lDV do Q y H 05 Jp qg k d+1 G 4 A==

和C#程序生成像

所以有人能帮我纠正我的java程序吗...谢谢

共有2个答案

苏乐童
2023-03-14

您正在对不同的对象进行URLen编码,只需尝试以下代码:

byte[] modulusBytes = Base64.decode("zgfXY1oUe4nyndX4qtobP1BMxtJ1/rfKU5csdAcWrSVu6ZaEAX3rL3cWnaSLzX4E1BNjSP9pjge6TH7UoaWqOQ==");
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/ECB/PKCS1Padding");

cipher.init(Cipher.ENCRYPT_MODE, pubKey);

byte[] plainBytes = new String("Admin123").getBytes("UTF-8");

byte[] cipherData = cipher.doFinal( plainBytes );

String string = new String(cipherData);

System.out.println(URLEncoder.encode(string,"UTF-8"));
祁正阳
2023-03-14

在我看来,您正在对两种不同的内容进行URL编码:

  • 在Java中,您正在编码Base64编码的字符串,而

这两种不同方法的结果不会相同。也许你应该在Java部分编码new String(cipherData)-或者在编码之前比较两个byte[]数组?

干杯,

 类似资料:
  • 我试图与客户机和服务器进行Diffie-Hellman密钥交换,但由于某种原因,当我解密发送到服务器的消息时。我得到以下例外: 我知道我的加密/解密方法工作得很好,因为如果我这样做:,不会引发异常。有人知道为什么会这样吗?下面是我的客户端和服务器代码。 蒂娅! 客户 服务器 加密 解密 为了澄清,RSA密码是RSA/ECB/PKCS1Padding,PRIV_KEY/PUB_KEY是从KeyToo

  • 想要在java中使用生成的RSA公钥,在c#函数中加密数据并在Java解密函数中解密。 生成的Java公钥已被替换为c#中的模数标记: C#加密功能: Java解密函数: 第一个问题:在c#XML字符串中替换模数标记中的Java公钥正确吗?指数标签呢?我用了AQAB值。 第二个问题:为什么在解密Java得到这个错误: 经过一些研究,我发现这是一个普遍的错误,什么原因会导致这种错误?

  • 主要内容:1.对称加密,2.非对称加密,3.混合加密,4.常见的摘要算法1.对称加密 AES,密钥长度有128/256/192。高级加密标准,是下一代的加密算法标准,速度快,安全级别高; DES:密钥为56, 数据加密标准,速度较快,适用于加密大量数据的场合。 3DES: 密钥为168.是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 IDES: 密钥为128 SM1: 密钥为128 SM4: 密钥为128 RC4, RC5, RC6 DESX 两边用

  • 这是一个桌面应用程序,所以我只需要基本的登录安全性,我想使用一个函数来加密密码,另一个函数我从UI传递密码并将其散列保存到db中,然后返回true o false,这取决于匹配与否。 我尝试使用jasypt官方网站的池版本,我可以加密,但我不知道如何解密。 我是安全方面的新手,所以我对安全不太了解,我接受其他建议或替代方案,我只想要一个工作示例。

  • 使用 :X 命令为文件设定一个密码 :X Enter encryption key: ****** Enter same key again: ****** 如果要取消加密,可以设置密码为空 可以禁用交换文件,以免泄密 vim -x -n file.txt 如果你已在经编辑这个文件了,那么交换文件 swapfile 可以用下面的命令禁止: :setlocal noswapfile 由于没了交换文件

  • 本文向大家介绍JS实现的base64加密、md5加密及sha1加密详解,包括了JS实现的base64加密、md5加密及sha1加密详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现的base64加密、md5加密及sha1加密。分享给大家供大家参考,具体如下: 1、base64加密 在页面中引入base64.js文件,调用方法为: 2、md5加密 在页面中引用md5.js文件,调用