編集:
この質問を申し訳ありませんが、私は自分ですぐに解決しました...私がしなければならなかった唯一のことは、パディングをゼロに設定することでした:
aes.Padding = PaddingMode.Zeros
SSLを使用せずにVB.Netアプリケーション間のトラフィックを暗号化しようとしています(ユーザーは一部の機密性の高い引数のみを表示できないようにする必要があるため)。したがって、PHPとVB.Netで同じ暗号化/復号化の結果を達成しようとしますが、機能しません。
最初は私の小さなVB.Net暗号化機能:
Friend Enum CryptionMode
Encrypt
Decrypt
End Enum
Friend Function cryptAes(ByVal mode As CryptionMode, ByVal input As Byte(), ByVal pw As String) As Byte()
Dim salt As Byte() = {42, 248, 0, 22, 19, 46, 162, 81, 192, 167, 174, 102, 233}
Dim aes As New RijndaelManaged
Dim keyGen As New Rfc2898DeriveBytes(pw, salt)
aes.Key = keyGen.GetBytes(aes.Key.Length)
aes.IV = keyGen.GetBytes(aes.IV.Length)
Debug.WriteLine(Convert.ToBase64String(aes.Key))
Debug.WriteLine(Convert.ToBase64String(aes.IV))
Dim ms As New MemoryStream
Dim cs As New CryptoStream(ms, If(mode = CryptionMode.Decrypt, aes.CreateDecryptor, aes.CreateEncryptor), CryptoStreamMode.Write)
Try
cs.Write(input, 0, input.Length)
cs.Close()
Dim output As Byte() = ms.ToArray
Debug.WriteLine(output.Length)
ms.Close()
Return output
Catch ex As Exception
Debug.WriteLine("Error")
Return Nothing
End Try
End Function
Friend Function cryptAesToBase64(ByVal mode As CryptionMode, ByVal input As Byte(), ByVal pw As String) As String
Return Convert.ToBase64String(cryptAes(mode, input, pw))
End Function
この行を実行することによって
cryptAesToBase64(CryptionMode.Encrypt, System.Text.Encoding.ASCII.GetBytes("hallihallo"), "pass")
私は次のものを手に入れました
9sNq3BjYaU6ZIrLEfG1hXrkdOoGc6FoeCQ3T2asXSs4= (key)
oxBgLuPha+Rvm7KV5+3V3A== (IV)
16 (output length)
"hwcc7Cog9FornwAzo6hIuA==" (output)
しかし、今ではPHP暗号化があります。最初に、Rfc2898DeriveBytes関数と同等の関数を定義する必要がありました。
function pbkdf2($algorithm, $password, $salt, $count, $key_length, $raw_output = false)
{
$algorithm = strtolower($algorithm);
if(!in_array($algorithm, hash_algos(), true))
die('PBKDF2 ERROR: Invalid hash algorithm.');
if($count <= 0 || $key_length <= 0)
die('PBKDF2 ERROR: Invalid parameters.');
$hash_length = strlen(hash($algorithm, "", true));
$block_count = ceil($key_length / $hash_length);
$output = "";
for($i = 1; $i <= $block_count; $i++) {
// $i encoded as 4 bytes, big endian.
$last = $salt . pack("N", $i);
// first iteration
$last = $xorsum = hash_hmac($algorithm, $last, $password, true);
// perform the other $count - 1 iterations
for ($j = 1; $j < $count; $j++) {
$xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
}
$output .= $xorsum;
}
return substr($output, 0, $key_length);
}
次に、暗号化コマンド:
$mySalt = base64_decode("KvgAFhMuolHAp65m6Q==");
$dev = pbkdf2("sha1", "pass", $mySalt, 1000, 48, true);
$key = substr($dev, 0, 32); //Keylength: 32
$iv = substr($dev, 32, 16); // IV-length: 16
echo "key: ".base64_encode($key)."<br>";
echo "iv: ".base64_encode($iv)."<br>";
$text = base64_decode("aGFsbGloYWxsbw=="); //"hallihallo";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
echo strlen($crypttext)."<br>";
echo base64_encode($crypttext);
これを実行すると、次の出力が得られます。
key: 9sNq3BjYaU6ZIrLEfG1hXrkdOoGc6FoeCQ3T2asXSs4=
iv: oxBgLuPha+Rvm7KV5+3V3A==
16 (output length)
BeyMKI9PAy5IThiM6XcsVQ==
PHPとVB.Netには同じキー、同じIV、同じ入力、同じCiphermodeがありますが、同じ出力ではないため、少し混乱しています。誰かが今ここで何が悪いのですか?
ありがとう、私の悪い英語をお詫びします:)