2011-09-09 27 views
1

私はサーバーから私に送られた公開RSAキーでパスワードを暗号化しようとしていました。C#公開RSA-1280六角キーで文字列を暗号化

var csp = new CspParameters(1, "Microsoft Strong Cryptographic Provider"); 
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1280, csp); 
byte[] key = ByteUtils.HexToBytes(client.RSAKey); 
RSA.ImportCspBlob(key); 
byte[] encrypted = RSA.Encrypt(Encoding.ASCII.GetBytes(password), true); 

六角キーは、このような形式で提供される文字列が16進形式320バイト長である

string key = "30819D300D06092A864886F70D010101050003818B0030818702818100C7BD672D8C634D443840AD809790852770D3A2E99F456D6516329E0205D0645C23FD001D4D070CEE368A20526FEB2402358C915D7E86102B1659AA8651C449C344599F72BE904B8E338E7002E9978453C5BBCCA51AC165AA265069E0EAB1411D11A2FFDD35E5A8296A6A2AF238945874E8206979B0A16E2E4260A161CAB5C905020111"; 

ように、私は、キーは、この方法を使用して160バイト(1280 RSA) であると仮定しますプロバイダは「プロバイダのバージョンが正しくありません。\ r \ n」と続けます。 私はいくつかの方法を試して、それをBase64に変換し、単純にASCII/Unicodeとしてインポートします。これまでに何もできませんでした。

EDIT:私のHexToBytes機能(私の知る限りで働き、それは私に正しい160-Bの配列を返します):

public static byte[] HexToBytes(string pValue) 
     { 
      // FIRST. Use StringBuilder. 
      StringBuilder builder = new StringBuilder(); 

      // SECOND... USE STRINGBUILDER!... and LINQ. 
      foreach (char c in pValue.Where(IsHexDigit).Select(Char.ToUpper)) 
      { 
       builder.Append(c); 
      } 

      // THIRD. If you have an odd number of characters, something is very wrong. 
      string hexString = builder.ToString(); 
      if (hexString.Length % 2 == 1) 
      { 
       //throw new InvalidOperationException("There is an odd number of hexadecimal digits in this string."); 
       // I will just add a zero to the end, who cares (0 padding) 
       Log.WriteLine(LogLevel.Debug, "Hexstring had an odd number of hexadecimal digits."); 
       hexString += '0'; 
      } 

      byte[] bytes = new byte[hexString.Length/2]; 
      // FOURTH. Use the for-loop like a pro :D 
      for (int i = 0, j = 0; i < bytes.Length; i++, j += 2) 
      { 
       string byteString = String.Concat(hexString[j], hexString[j + 1]); 
       bytes[i] = HexToByte(byteString); 
      } 
      return bytes; 
     } 
+0

HexToBytesメソッドはどのように見えますか?そのコードに誤りがありますか? –

+0

私はそれが16進数からバイト配列を返すと確信していますが、それは何か奇妙な理由のためのキーとしてそれを期待していないということです。 –

+0

'HexToBytes'が間違っています。あなたはバイトの順序を逆にしているようです。 'StringBuilder'の全体の使用は無意味でエラーを誘発します。 –

答えて

3

あなたの公開鍵が正しい形式ではありません。これはCSPブロブではありません。 DERでコード化されたSubjectPublicKeyInfo構造体です。あなたはそれを解析するためのソースコードを見つけることができますまたはあなた自身を書くことができます。 Hereはそのようなコードの一例です。

関連する問題