【问题标题】:Why does my Java RSA encryption give me an Arithmetic Exception?为什么我的 Java RSA 加密会给我一个算术异常?
【发布时间】:2010-04-22 14:14:44
【问题描述】:

在 .NET 中,我生成了以下公钥文件:

<RSAKeyValue>
   <Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus>
   <Exponent>AQAB</Exponent>
</RSAKeyValue>

.NET 很乐意使用它的常规方法进行加密。

我正在尝试使用此密钥在 Java 中对字符串进行编码。尝试加密字符串时遇到算术异常。

以下是我用来加密的代码:

byte[] modulusBytes = Base64.decode(this.getString(R.string.public_key_modulus));
byte[] exponentBytes = Base64.decode(this.getString(R.string.public_key_exponent));
BigInteger modulus = new BigInteger( modulusBytes );                
BigInteger exponent = new BigInteger( 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[] cipherData = cipher.doFinal( new String("big kitty dancing").getBytes() );    

这是代码块中失败的最后一行。

我看过很多例子,这是我能想到的最好的例子。如果不明显,R.string.public_key_modulus 是 Modulus 元素中文本的复制/粘贴,同样适用于指数。

我做错了什么?

【问题讨论】:

    标签: java .net encryption rsa


    【解决方案1】:

    试试这个:

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

    否则你会得到一个负模数。 BigInteger(byte[]) 构造函数采用 signed 大端表示。 BigInteger(int, byte[]) 构造函数使用提供的符号位(此处“1”表示“正”)。

    另外,请注意String.getBytes(),它使用平台“默认字符集”,这取决于运行应用程序的机器的配置。如果您想要可重现的结果,最好指定一个明确的字符集(例如"UTF-8")。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多