0

アプリケーションのログと認証に Windows Live Id サービスを使用しています。ユーザーが認証された後、Windows Live Id Service から送信される応答でトークンを取得します。このトークンから一意の識別子を取得するために、このトークンをデコードしたいと考えています。これをよりよく説明するリンクは次のとおりです

Visual Studio でのデバッグ中に、CryptoStream オブジェクトを作成しようとすると例外が発生しますが、コードは壊れません。

しかし、ストリームをバイトに変換しようとすると、エラーがスローされ、コードが壊れます。

それは言います:

「復号化するデータの長さが無効です」

私が使用しているコードは次のとおりです。

     string token="";                     //Token Sent by the service
     string SecretKey = "";              //SecretKey Obtained while registering my application
     byte[] cryptKey = derive(secretKey, "ENCRYPTION");  


    static byte[] derive(string secret, string prefix)
      {
         using(HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256"))
         { 
          const int keyLength = 16;
          byte[] data = Encoding.Default.GetBytes(prefix+secret);
          byte[] hashOutput = hashAlg.ComputeHash(data);
          byte[] byteKey = new byte[keyLength];
          Array.Copy(hashOutput, byteKey, keyLength);
          return byteKey;
         }
      }

    const int ivLength = 16;
    token = HttpUtility.UrlDecode(token);
    byte[] ivAndEncryptedValue = Convert.FromBase64String(token);
    aesAlg = new RijndaelManaged();
    aesAlg.KeySize = 128;
    aesAlg.Key = cryptKey;
    aesAlg.Padding = PaddingMode.PKCS7;
    memStream = new MemoryStream(ivAndEncryptedValue);
    byte[] iv = new byte[ivLength];
    memStream.Read(iv, 0, ivLength);
    aesAlg.IV = iv; 
    cStream = new CryptoStream(memStream, aesAlg.CreateDecryptor(), CryptoStreamMode.Read);
    sReader = new StreamReader(cStream, Encoding.ASCII);

コードの次の行は、「復号化するデータの長さが無効です」というエラーをスローします。

    decodedValue = sReader.ReadToEnd();    //Throws error:"Length of the data to decrypt is invalid"

この背後にある理由が何であるかについて、誰かが何か考えを持っていますか?

どんな種類の助けや指導も大歓迎です。

前もって感謝します。

よろしく、

アビシェーク

4

1 に答える 1

1

これは、値を復号化するときに現在使用しているものの例です。これが、既存のコードで誤って実行したことを確認するのに役立つことを願っています

static string Decrypt() 
    {            
      byte[] keyBytes = Convert.FromBase64String("U6XksFkhWV4.......eo3fRg=="");
      byte[] iv = Convert.FromBase64String("KLnP....wA=="");
      byte[] cipherTextBytes = Convert.FromBase64String("Put the EncryptedText here");

      var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, IV = iv, KeySize = 128, Key = keyBytes, Padding = PaddingMode.Zeros};

      using (var decryptor = symmetricKey.CreateDecryptor())
      using (var ms = new MemoryStream(cipherTextBytes))
      using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {
        var plainTextBytes = new byte[cipherTextBytes.Length];
        int decryptedByteCount = cs.Read(plainTextBytes, 0, plainTextBytes.Length);
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
      }
    }
于 2012-11-14T19:01:30.017 に答える