お世話になります。
現在C#でファイルをAES暗号で暗号化しファイル出力、
復号の際は暗号化ファイルを読み込み復号しファイル出力するソースコードを書いています。
復号の際には暗号化ファイルを読み込み、標準出力したいと思っていますがうまくいかないため、
どのようにすれば良いか教えていただきたいです。
自分としてはコメントの①のFileStream outsをほかのストリームにすれば良いのではないかと考えています。
お忙しいと思いますが宜しくお願いします。
c#
1static void Main() 2 { 3 string sfile = @"C:\test\enc.txt"; //暗号化前ファイル 4 string dfile = @"C:\test\dec.txt"; //暗号化ファイル 5 string efile = @"C:\test\out.txt"; //復号ファイル 6 string key = @"hoge"; //パスワード 7 AesEnc(sfile, dfile, key); 8 AesDec(dfile, efile, key); 9 } 10//暗号化 11static void AesEnc(string sFile, string dFile, string key) 12 { 13 AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 14 15 aes.BlockSize = 128; 16 aes.KeySize = 128; 17 aes.Mode = CipherMode.CBC; 18 aes.Padding = PaddingMode.PKCS7; 19 20 aes.GenerateIV(); 21 byte[] byteIV = aes.IV; 22 23 byte[] bytesPassword = Encoding.UTF8.GetBytes(key); 24 byte[] bytesKey = new byte[16]; 25 26 for (int i = 0; i < 16; i++) 27 { 28 if (i < bytesPassword.Length) 29 { 30 bytesKey[i] = bytesPassword[i]; 31 } 32 else 33 { 34 bytesKey[i] = 0; } 35 } 36 37 aes.Key = bytesKey; 38 39 ICryptoTransform encrypt = aes.CreateEncryptor(); 40 FileStream outfs = new FileStream(dFile, FileMode.Create, FileAccess.Write); 41 outfs.Write(byteIV, 0, 16); 42 43 CryptoStream cs = new CryptoStream(outfs, encrypt, CryptoStreamMode.Write); 44 FileStream fs = new FileStream(sFile, FileMode.Open, FileAccess.Read); 45 46 byte[] buf = new byte[1024]; 47 int len; 48 49 while ((len = fs.Read(buf, 0, buf.Length)) > 0) 50 { 51 cs.Write(buf, 0, len); 52 53 } 54 fs.Close(); 55 cs.Close(); 56 encrypt.Dispose(); 57 outfs.Close(); 58 } 59 60//復号 61static void AesDec(string sFile, string dFile, string key) 62 { 63 AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 64 65 aes.BlockSize = 128; 66 aes.KeySize = 128; 67 aes.Mode = CipherMode.CBC; 68 aes.Padding = PaddingMode.PKCS7; 69 70 byte[] bytesPassword = Encoding.UTF8.GetBytes(key); 71 byte[] bytesKey = new byte[16]; 72 byte[] bytesIV = new byte[16]; 73 74 for (int i = 0; i < 16; i++) 75 { 76 if (i < bytesPassword.Length) 77 { 78 bytesKey[i] = bytesPassword[i]; 79 } 80 else 81 { 82 bytesKey[i] = 0; 83 } 84 } 85 86 aes.Key = bytesKey; 87 88 FileStream fs = new FileStream(sFile, FileMode.Open, FileAccess.Read); 89 90 fs.Read(bytesIV, 0, 16); 91 aes.IV = bytesIV; 92 93 ICryptoTransform encrypt = aes.CreateDecryptor(); 94 //① 95 FileStream outfs = new FileStream(dFile, FileMode.Create, FileAccess.Write); 96 CryptoStream cs = new CryptoStream(outfs, encrypt, CryptoStreamMode.Write); 97 98 byte[] buf = new byte[1024]; 99 100 int len; 101 102 while ((len = fs.Read(buf, 0, buf.Length)) > 0) 103 { 104 cs.Write(buf, 0, len); 105 Console.WriteLine(Encoding.GetEncoding("shift_jis").GetString(buf)); 106 } 107 108 fs.Close(); 109 cs.Close(); 110 encrypt.Dispose(); 111 outfs.Close(); 112 } 113 114
Console.WriteLine(outfs.ToString());としても表示されないことから
ほかのストリームを使用すればできるのではないかと思っています。
(全く見当違いかもしれません・・・)
追加ありがとうございます。
うーん、StringWriterなどにする手はありますが、気になるのは、バッファの境界に漢字の真ん中が来た場合ですかね。
実際の運用で使う場合はファイル容量が1kb以下になると想定しています。
バッファも適当に決めているのでもう少し増やしても問題ないかと思います。
回答1件
あなたの回答
tips
プレビュー