2013-12-20 1 views
2

내가 암호화, 나중에 해독, 다음과 같은 코드를 사용하여 암호 수 있습니다 C# 코드를 본 적이 :자바 스크립트에서 Rfc2898DeriveBytes와 동등한가요?

http://wp7-travel.googlecode.com/svn/trunk/SilverlightPhoneDatabase/Cryptography.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 
using System.Reflection; 

namespace SilverlightPhoneDatabase 
{ 
    /// <summary> 
    /// Class used to encrypt the database 
    /// </summary> 
    public static class Cryptography 
    { 

     /// <summary> 
     /// Incrypt the input using password provided 
     /// </summary> 
     /// <param name="input">Input string to encrypt</param> 
     /// <param name="password">Password to use</param> 
     /// <returns>Encrypted string</returns> 
     public static string Encrypt(string input, string password) 
     { 

      string data = input; 
      byte[] utfdata = UTF8Encoding.UTF8.GetBytes(data); 
      byte[] saltBytes = UTF8Encoding.UTF8.GetBytes(password); 



      // Our symmetric encryption algorithm 
      AesManaged aes = new AesManaged(); 

      // We're using the PBKDF2 standard for password-based key generation 
      Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, saltBytes); 

      // Setting our parameters 
      aes.BlockSize = aes.LegalBlockSizes[0].MaxSize; 
      aes.KeySize = aes.LegalKeySizes[0].MaxSize; 
      aes.Key = rfc.GetBytes(aes.KeySize/8); 
      aes.IV = rfc.GetBytes(aes.BlockSize/8); 

      // Encryption 
      ICryptoTransform encryptTransf = aes.CreateEncryptor(); 

      // Output stream, can be also a FileStream 
      MemoryStream encryptStream = new MemoryStream(); 
      CryptoStream encryptor = new CryptoStream(encryptStream, encryptTransf, CryptoStreamMode.Write); 

      encryptor.Write(utfdata, 0, utfdata.Length); 
      encryptor.Flush(); 
      encryptor.Close(); 

      byte[] encryptBytes = encryptStream.ToArray(); 
      string encryptedString = Convert.ToBase64String(encryptBytes); 

      return encryptedString; 
     } 

     /// <summary> 
     /// Decrypt string using password provided 
     /// </summary> 
     /// <param name="base64Input">Input to decrypt</param> 
     /// <param name="password">Password to use</param> 
     /// <returns>Decrypted string</returns> 
     public static string Decrypt(string base64Input, string password) 
     { 

      byte[] encryptBytes = Convert.FromBase64String(base64Input); 
      byte[] saltBytes = Encoding.UTF8.GetBytes(password); 

      // Our symmetric encryption algorithm 
      AesManaged aes = new AesManaged(); 

      // We're using the PBKDF2 standard for password-based key generation 
      Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(password, saltBytes); 

      // Setting our parameters 
      aes.BlockSize = aes.LegalBlockSizes[0].MaxSize; 
      aes.KeySize = aes.LegalKeySizes[0].MaxSize; 
      aes.Key = rfc.GetBytes(aes.KeySize/8); 
      aes.IV = rfc.GetBytes(aes.BlockSize/8); 

      // Now, decryption 
      ICryptoTransform decryptTrans = aes.CreateDecryptor(); 

      // Output stream, can be also a FileStream 
      MemoryStream decryptStream = new MemoryStream(); 
      CryptoStream decryptor = new CryptoStream(decryptStream, decryptTrans, CryptoStreamMode.Write); 

      decryptor.Write(encryptBytes, 0, encryptBytes.Length); 
      decryptor.Flush(); 
      decryptor.Close(); 

      byte[] decryptBytes = decryptStream.ToArray(); 
      string decryptedString = UTF8Encoding.UTF8.GetString(decryptBytes, 0, decryptBytes.Length); 
      return decryptedString; 
     } 
    } 
} 

내가 어떤 보안 전문가도 아니다 및 암호화 알고리즘과 경험이 제한되어. 그런 종류의 코드로 암호화 된 암호화 된 암호가 있는데 이제는 node.js 프로그램 (Javascript)에서 해독 된 암호에 액세스하려고합니다.

crypto-js에는 pbkdf2.js 모듈이 있지만 암호를 암호화하는 방법 만 알고있는 것으로 보입니다.

나는 http://anandam.name/pbkdf2/을 보았지만 다시는 암호 전용으로 보입니다. 암호 해독 없음.

일반 소금 (예 : crypto-js)을 사용하여 일반 자바 스크립트를 사용하여 알려진 소금 및 반복을 사용하여 암호를 해독 할 코드를 제공 할 수 있습니까?

답변

3

PBKDF는 키 기반 파생 기능입니다. PBKDF는 암호화 알고리즘이 아닙니다. 그것들은 소금 ​​(동일한 암호에 대한 고유 한 출력을 만들기 위해)과 반복 횟수 (느리게 만들기 위해)를 사용하는 안전한 해시 알고리즘과 비교할 수 있습니다. 귀하의 질문에 PBKDF2 같은 많은 PBKDF, 실제로 SHA - 1 같은 해시 알고리즘을 사용하여 구현됩니다.

PBKDF 함수는 종종 암호에 고유 식별자를 생성하는 데 자주 사용됩니다. 이 식별자는 생성 된 키 머티리얼의 모든 속성을 갖습니다 (, 무단 입력 공격을 사용하지 않고 입력 데이터를 검색 할 수 없다는 속성 포함). 즉, 암호를 해독 할 수 없습니다. PBKDF2의 결과가 일치하는지 확인하기 위해 각 가능한 암호 만 시도 할 수 있습니다.

관련 문제