2016-06-30 20 views
0

)RSAParameterでモジュラスパラメータを設定する際に問題があります。 私のパブリックキー文字列をバイト配列で変換しています。私の問題は長さが長すぎることです。モジュラスRSAパラメータ(文字列公開鍵

byte[] lExponent = { 1, 0, 1 }; 

//Create a new instance of the RSACryptoServiceProvider class. 
RSACryptoServiceProvider lRSA = new RSACryptoServiceProvider(); 


//Create a new instance of the RSAParameters structure. 
RSAParameters lRSAKeyInfo = new RSAParameters(); 

//Set RSAKeyInfo to the public key values. 
string KeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCV/eUrmhIZul32nN41sF0y/k4detUxPTQngHFQGOoQNCRa84+2mGdCAg3EN9DPsUtCSHjscfp5xC9otgZsj13Rn7atbGZhJn5eZpIzPZV/psfeueL0Idq7b1msyBNG8dqR0WblYvzSY8uWwIIWyOkrQvtUwHJoxrBD4iLO/NEvzQIDAQAB"; 
PublicKey = Convert.FromBase64String(KeyString); 


lRSAKeyInfo.Modulus = PublicKey; 
lRSAKeyInfo.Exponent = lExponent; 

lRSA.ImportParameters(lRSAKeyInfo); 

return Convert.ToBase64String(lRSA.Encrypt(InputStringbytes, false)); 

problimは私のキーサイズは1296と1024でない私はXMLParameter文字列を使用してテストしているということですが、私は同じ問題を抱えています。

私は助けが必要です。事前のお礼

答えて

0

元の公開鍵に何か問題があると思われる場合、または正しいと思われ、コードが機能していないと思われる場合、私は本当に理解できません。あなたがキーのバイト配列とそれを呼び出す必要がある場合

public string PublicKeyEncrypt(string plaintext, Stream publickey) 
{ 
    try 
    { 
     var rsaKeyParameters = (RsaKeyParameters)PublicKeyFactory.CreateKey(publickey); 
     var rsaParameters = new RSAParameters(); 
     rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(); 
     rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned(); 
     var rsa = new RSACryptoServiceProvider(); 
     rsa.ImportParameters(rsaParameters); 
     return Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(plaintext), true)); 
    } 
    catch (Exception e) 
    { 
     // Whatever 
    } 
} 

そして:私は、暗号化のために、以下の(はBouncyCastleライブラリ)を使用

public string PublicKeyEncrypt(string plaintext, byte[] publickey) 
{ 
    return PublicKeyEncrypt(plaintext, new MemoryStream(publickey, false)); 
} 
+0

通常いただきありがとうございます、公開鍵は、理由はjavascriptの公開鍵の作業(https://github.com/travist/jsencrypt)ライブラリで、良いです。彼のライブラリを使わず、.NETでの暗号化を実現したいと思います。私のために私のコードは動作しません。 – Christophe

0

あなたの文字列は、それを意味し、216文字の長さ162バイトを表します。そして162バイトは1296ビットです。

このようにプログラムはあなたが言ったことを正確に行っているようです(ビット数でのモジュラスの長さはRSAキーサイズです)。

したがって、そこにある文字列はRSA 1024ビットモジュラス値を表していないので、間違ったデータ値をコピーしたに違いありません。

+0

私はそれを見ました。私はキーストリングに問題があったと思います。私は間違ったデータをコピーしていません。私は元の文字列を含む文字列をカットしています----- BEGIN PUBLIC KEY -----と----- END PUBLIC KEY ----- – Christophe

+0

私のプロジェクトでは、パスワードを暗号化する必要があります。 Open AMを持つSSO lgin実際にはこの公開鍵ですでに使用されており、パスワードはJSENCRYPT.JSで暗号化されています。そして問題はありません。これは、私がCの開発に問題がある理由です。 – Christophe

+0

今すぐ別の公開鍵とテストを生成しようとします – Christophe

0

KeyStringは、実際には1024ビットのRSAモジュラスを含むBase64エンコードDERエンコードSubjectPublicKeyInfoオブジェクトです。自分で確認するにはlapo.it base64 ASN.1 decoderを使用してください。そこにbase64文字列をコピー&ペーストして、デコードをクリックしてください。

Javaでは、この形式(base64エンコーディングなし)はPublicKey.getEncoded()メソッドによって返されます。

この質問に対処するために、さまざまな答えがstackoverflowにあります。 this answerbouncycastle C# libraryが使用され、次のC#フラグメントが供給される。

byte[] publicKeyBytes = Convert.FromBase64String(publicKeyString); 
AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(publicKeyBytes); 
RsaKeyParameters rsaKeyParameters = (RsaKeyParameters) asymmetricKeyParameter; 
RSAParameters rsaParameters = new RSAParameters(); 
rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned(); 
rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned(); 
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
rsa.ImportParameters(rsaParameters); 

This answerは、コードのより長い配列を含むが、はBouncyCastle C#のライブラリを使用して回避します。

これらのいずれもテストしていません。

0

これは、DERでエンコードされたBLOBの公開鍵で係数を得るためのソリューションです。

private string Encrypt(string pPublicKey, string pInputString) 
    { 
     //Create a new instance of the RSACryptoServiceProvider class. 
     RSACryptoServiceProvider lRSA = new RSACryptoServiceProvider(); 

     //Import key parameters into RSA. 
     lRSA.ImportParameters(GetRSAParameters(pPublicKey)); 

     return Convert.ToBase64String(lRSA.Encrypt(Encoding.UTF8.GetBytes(pInputString), false)); 
    } 

    private static RSAParameters GetRSAParameters(string pPublicKey) 
    { 
     byte[] lDer; 

     //Set RSAKeyInfo to the public key values. 
     int lBeginStart = "-----BEGIN PUBLIC KEY-----".Length; 
     int lEndLenght = "-----END PUBLIC KEY-----".Length; 
     string KeyString = pPublicKey.Substring(lBeginStart, (pPublicKey.Length - lBeginStart - lEndLenght)); 
     lDer = Convert.FromBase64String(KeyString); 


     //Create a new instance of the RSAParameters structure. 
     RSAParameters lRSAKeyInfo = new RSAParameters(); 

     lRSAKeyInfo.Modulus = GetModulus(lDer); 
     lRSAKeyInfo.Exponent = GetExponent(lDer); 

     return lRSAKeyInfo; 
    } 

    private static byte[] GetModulus(byte[] pDer) 
    { 
     //Size header is 29 bits 
     //The key size modulus is 128 bits, but in hexa string the size is 2 digits => 256 
     string lModulus = BitConverter.ToString(pDer).Replace("-", "").Substring(58, 256); 

     return StringHexToByteArray(lModulus); 
    } 

    private static byte[] GetExponent(byte[] pDer) 
    { 
     int lExponentLenght = pDer[pDer.Length - 3]; 
     string lExponent = BitConverter.ToString(pDer).Replace("-", "").Substring((pDer.Length * 2) - lExponentLenght * 2, lExponentLenght * 2); 

     return StringHexToByteArray(lExponent); 
    }  

    public static byte[] StringHexToByteArray(string hex) 
    { 
     return Enumerable.Range(0, hex.Length) 
         .Where(x => x % 2 == 0) 
         .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
         .ToArray(); 
    } 

はあなたの助け

関連する問題