-1

私は Mega 暗号化 API を試していますが、RSA 復号化の部分で行き詰まっています。

使用する JavaScript は次のとおりです。

// Compute m**d mod p*q for RSA private key operations.

function RSAdecrypt(m, d, p, q, u)
{    
 var xp = bmodexp(bmod(m,p), bmod(d,bsub(p,[1])), p);
 var xq = bmodexp(bmod(m,q), bmod(d,bsub(q,[1])), q);

 var t=bsub(xq,xp);
 if(t.length==0)
 {
  t=bsub(xp,xq);
  t=bmod(bmul(t, u), q);
  t=bsub(q,t);
 }
 else
 {
  t=bmod(bmul(t, u), q);
 } 
 return badd(bmul(t,p), xp);
}

私は .NET (BigInteger をサポートする 4.0) を使用しており、同じ動作を再現しようとしています。

私が持っているRSAデータは次のとおりです。

p (1024 bits)
q (1024 bits)
d (2044 bits)
u (1024 bits)
m (2044 bits) (the ciphered data)

RSACryptoServiceProvider を試してみましたが、うまくいきませんでした。別の投稿で、別のユーザーが、基本的な RSA 復号化アルゴリズム (m**d mod p*q) を使用して、RSACryptoServiceProvider を回避したと報告しました。

私はそれを実装し(U部分は必要ありません、理解しています)、入力がJavascript入力とまったく同じであることを確認しましたが、それでもうまくいきませんでした。出力は、Javascript コードによって期待されるものと同じではありません。

これは実装された関数です:

Public Shared Function RSA_Decrypt(ByVal P As Numerics.BigInteger, ByVal Q As Numerics.BigInteger, ByVal D As Numerics.BigInteger, ByVal M As Numerics.BigInteger) As Byte()
    Dim N As System.Numerics.BigInteger = Numerics.BigInteger.Multiply(P, Q)
    Dim DecryptedData As System.Numerics.BigInteger = Numerics.BigInteger.ModPow(M, D, N)
    Return DecryptedData.ToByteArray
End Function

テストコード:

Dim P As New Numerics.BigInteger(Convert.FromBase64String("gbb1FjTy...s="))
Dim Q As New Numerics.BigInteger(Convert.FromBase64String("o0fGo0v...8="))
Dim D As New Numerics.BigInteger(Convert.FromBase64String("GFVe9C...bQ=="))
Dim Data As New Numerics.BigInteger(Convert.FromBase64String("BnrSc/..Dg=="))

Dim ResultBytes As Byte() = cripto.RSA_Decrypt(P, Q, D, Data)
Dim ResultStr As String = Convert.ToBase64String(ResultBytes)

このコードは次を返します。

Vd2jBCzObTx...QW1y+VRSZHAw==

ただし、JavaScript 関数は

LUyj3pyIyr4g...1aZU=

何が間違っているのか、どうすれば解決できるのか分かりますか?

4

1 に答える 1

1

@CodesInChaos は正しく、エンディアンの問題でした。

hereから取得した関数「OS2IP」を使用しました。それを使用して、バイト配列から BigInteger を生成しました。

Dim P As Numerics.BigInteger = cripto.OS2IP(Convert.FromBase64String("gbb1FjTyN ... hs="), false)

次に、生成されたバイト配列を逆にする必要がありました。

Dim ResultBytes As Byte() = cripto.RSA_Decrypt(P, Q, D, Data).Reverse.ToArray

そして、エンディアンを修正する関数:

''' <summary>
''' Converts a byte array to a non-negative integer.
''' </summary>
''' <param name="data">The number in the form of a byte array.</param>
''' <param name="isLittleEndian">Endianness of the byte array.</param>
''' <returns>An non-negative integer from the byte array of the specified endianness.</returns>
Public Shared Function OS2IP(data As Byte(), isLittleEndian As Boolean) As Numerics.BigInteger
    Dim bi As Numerics.BigInteger = 0
    If isLittleEndian Then
        For i As Integer = 0 To data.Length - 1
            bi += Numerics.BigInteger.Pow(256, i) * data(i)
        Next
    Else
        For i As Integer = 1 To data.Length
            bi += Numerics.BigInteger.Pow(256, i - 1) * data(data.Length - i)
        Next
    End If
    Return bi
End Function

その変更により、結果は正しいものになりました。次に、タイミング攻撃の問題を見ていきます:)

于 2013-02-08T11:19:50.283 に答える