私は 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=
何が間違っているのか、どうすれば解決できるのか分かりますか?