2

次のようなコードを使用して、パスワードを暗号化し、後で復号化できる C# コードを見てきました。

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-jspbkdf2.js、パスワードを暗号化する方法しか知りません。

http://anandam.name/pbkdf2/を見たことがありますが、これも暗号化のみのようです。復号化なし。

パスワードを暗号化するために使用された既知のソルトと反復が与えられた場合、プレーンな Javascript を使用して、できればcrypto-js.

4

1 に答える 1

3

PBKDF は、パスワード ベースのキー派生関数です。PBKDF は暗号化アルゴリズムではありません。それらは、ソルト (同一のパスワードの出力を一意にするため) および反復回数 (それらを遅くするため) を使用した一方向セキュア ハッシュ アルゴリズムと比較できます。質問の PBKDF2 など、多くの PBKDF は、実際には SHA-1 などのハッシュ アルゴリズムを使用して実装されています。

PBKDF 関数は、多くの場合、代わりにパスワードに一意の識別子を生成するために使用されます。その識別子には、ブルート フォース攻撃なしでは入力マテリアルを取得できないというプロパティを含め、生成されたキー マテリアルのすべてのプロパティが含まれます。つまり、パスワードを解読することはできません。可能性のある各パスワードを試して、PBKDF2 の出力が一致するかどうかを確認することしかできません。

于 2013-12-20T08:07:27.860 に答える