任意の長さのパス フレーズから生成された 256 ビットのキー値を取得する方法を知っている人はいますか? 暗号化された値を再度生成してデータベースで比較する必要があるため、暗号化をソルトすることはできません。したがって、値は暗号化されるたびに同じ暗号化文字列を生成する必要があります。
現在、私は 32 文字のキーを使用していますが、これは 256 ビットであるという誤った仮定に基づいていますか?
それで、「速い茶色のキツネ」を適切な AES 256 ビット鍵に変換したいと思いますか?
任意の長さのパス フレーズから生成された 256 ビットのキー値を取得する方法を知っている人はいますか? 暗号化された値を再度生成してデータベースで比較する必要があるため、暗号化をソルトすることはできません。したがって、値は暗号化されるたびに同じ暗号化文字列を生成する必要があります。
現在、私は 32 文字のキーを使用していますが、これは 256 ビットであるという誤った仮定に基づいていますか?
それで、「速い茶色のキツネ」を適切な AES 256 ビット鍵に変換したいと思いますか?
Rfc2898DeriveBytes Class
任意のサイズのパスワードを使用して を作成し、この場合は 256 ビット (32 バイト) の目的のサイズのキーを派生させることができ ます。
private static byte[] CreateKey(string password, int keyBytes = 32)
{
const int Iterations = 300;
var keyGenerator = new Rfc2898DeriveBytes(password, Salt, Iterations);
return keyGenerator.GetBytes(keyBytes);
}
確定的な出力を生成する (つまり、同じ入力が同じ出力を生成する) ためには、ソルトをハードコーディングする必要があります。ソルトは少なくとも 8 バイトである必要があります。
private static readonly byte[] Salt =
new byte[] { 10, 20, 30 , 40, 50, 60, 70, 80};
private static IBuffer GetMD5Hash(string key)
{
IBuffer bufferUTF8Msg = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8);
HashAlgorithmProvider hashAlgorithmProvider = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5);
IBuffer hashBuffer = hashAlgorithmProvider.HashData(bufferUTF8Msg);
if (hashBuffer.Length != hashAlgorithmProvider.HashLength)
{
throw new Exception("There was an error creating the hash");
}
return hashBuffer;
}
#region Static
public static string GenerateKey(string password, int resultKeyLength = 68)
{
if (password.Length < 6)
throw new ArgumentException("password length must atleast 6 characters or above");
string key = "";
var hashKey = GetMD5Hash(password);
var decryptBuffer = CryptographicBuffer.ConvertStringToBinary(password, BinaryStringEncoding.Utf8);
var AES = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7);
var symmetricKey = AES.CreateSymmetricKey(hashKey);
var encryptedBuffer = CryptographicEngine.Encrypt(symmetricKey, decryptBuffer, null);
key = CryptographicBuffer.EncodeToBase64String(encryptedBuffer);
string cleanKey = key.Trim(new char[] { ' ', '\r', '\t', '\n', '/', '+', '=' });
cleanKey = cleanKey.Replace("/", string.Empty).Replace("+", string.Empty).Replace("=", string.Empty);
key = cleanKey;
if(key.Length > resultKeyLength)
{
key = key.Substring(0, Math.Min(key.Length, resultKeyLength));
}
else if(key.Length == resultKeyLength)
{
return key;
}
else if (key.Length < resultKeyLength)
{
key = GenerateKey(key);
}
return key;
}
// AES キーの最初の 44 文字と AES IV の残りの文字を取得します
SHA256 など、任意の長さの入力から 256 ビットの出力を提供するハッシュ関数を使用できます。