これで、送信前にバイト[]をコード化してデコードすることを試みています。私は「これはスーパーの秘密のメッセージです。」からバイト[]に変換され、RijdaelManagedを使用して暗号化されています。暗号化されるとバイト[30](暗号化されていない)からバイト[16]になりますが、暗号化を解除しようとすると、バイト[13]になり、文字列ビルダーで文字列に変換されると "System.Byte []" 。RijdaelManaged暗号化されたバイト[]と同じキー/ ivを使用して復号化されたバイト[]と異なる
編集:
static void Main(string[] args)
{
KeyIV keyIV = Encryption.GenerateKeyIV();
int keyLen = keyIV.Key.Length;
int ivLen = keyIV.IV.Length;
string plain = "This is a super secret message";
byte[] plainArray = Encoding.ASCII.GetBytes(plain);
byte[] encryptedArray = Encryption.EncryptBytes(ref plainArray, keyIV.Key, keyIV.IV);
byte[] decryptedArray = Encryption.DecryptBytes(ref encryptedArray, keyIV.Key, keyIV.IV);
Console.WriteLine("Original Message: {0}\n", plain);
Console.WriteLine("Byte[{0}] Converted Message: {1}\n", plainArray.Length, BitConverter.ToString(plainArray));
Console.WriteLine("Byte[{0}] Encrypted Message: {1}\n", encryptedArray.Length, BitConverter.ToString(encryptedArray));
Console.WriteLine("Byte[{0}] Decrypted Message: {1}\n", decryptedArray.Length, BitConverter.ToString(decryptedArray));
Console.ReadLine();
}
暗号化方式:
public static byte[] EncryptBytes(ref byte[] input, byte[] key, byte[] iv)
{
if (input.Length > 0 && key != null && iv != null)
{
using (RijndaelManaged rm = new RijndaelManaged() { Key = key, IV = iv })
{
rm.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = rm.CreateEncryptor(rm.Key, rm.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(input); }
}
return ms.ToArray();
}
}
}
return null;
}
私はすでにトリプル
メソッドの呼び出しを暗号化/復号化する際keyIV.KeyとkeyIV.IVの両方が一致していることを確認解読方法:
public static byte[] DecryptBytes(ref byte[] input, byte[] key, byte[] iv)
{
if (input != null && key != null && iv != null)
{
using (RijndaelManaged rm = new RijndaelManaged() { Key = key, IV = iv })
{
ICryptoTransform decryptor = rm.CreateDecryptor(rm.Key, rm.IV);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { cs.Write(input, 0, input.Length); }
return ms.ToArray();
}
}
}
return null;
}
結果の出力:
オリジナルメッセージ:54-68-69-73-20-69-73-20-61-20-73:これは超秘密のメッセージ
バイト[30]変換されたメッセージであります-75-70-65-72-20-73-65-63-72-65-74-20-6D-65-73-73-61-67-65
バイト[16]暗号化されたメッセージ:DD -85-D4-1E-E6-40-AA-44-DB-1A-17-33-A7-73-70-34
バイト[13]解読されたメッセージ:53-79-73-74-65 -6D-2E-42-79-74-65-5B-5D
:私は私はあなたの配列のテキスト出力を比較すると、むしろバイト表現よりも、間違って何が起こっていたかのヒントを得た
つまり、 'encryptData'メソッドを調べると、' res'は30バイト、 'enc'は16バイトです。そうではないはずです。私はそれがどういうものか分かりません。 –encryptDataは同じクラスの内部(memorystream)から読み込みますが、62バイトをスキップします(これはヘッダーの長さなので)残りのバイト(この場合は30)を読み取り、暗号化して暗号化されたバイト[ ](この場合は16) –
これはできませんので、16進数でバイナリデータをデータに提供して、何が起きているのかを確認してください。最終ブロックはパディングが追加され、暗号化関数は最後のブロックであることを知る必要があるので、最終ブロックは出力されていないということです。通常、最終コールがあります。ストリーミングコードによって暗黙的に呼び出されることもあります。 – zaph