###実現したいこととトラブル
Visual Studio 2019のC#フォームアプリケーションで、ウィンドウに暗号化されたテキストファイルをドラッグアンドドロップして、テキストボックス①に暗号化されたテキストをそのまま表示、テキストボックス②に復号された平文を表示したいと思っております。
しかし、テキストボックス①にD&Dしたテキストファイルの中身をそのまま表示はできるのですが、復号して平文を表示させることができません(空白のままです)。
復号関数DecSの実行場所などが悪いのでしょうか??
###コード
C#
1 2namespace WindowsFormsApp2 3{ 4 public partial class Form1 : Form 5 { 6 7 public Form1() 8 { 9 InitializeComponent(); 10 } 11 12 private void Form1_DragDrop(object sender, DragEventArgs e) 13 { 14 if (e.Data.GetDataPresent(DataFormats.FileDrop)) 15 { 16 /*string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); 17 foreach(string filePath in filePaths) 18 richTextBox1.Text = string.Format(filePath); 19 */ 20 string[] fileNameAry = (string[])e.Data.GetData(DataFormats.FileDrop); 21 22 String fileName = fileNameAry[0]; 23 24 string EncryptedText = null; 25 string PlainText = null; 26 27 //取得したパスを使ってファイルを開く 28 using (StreamReader sr = new StreamReader(fileName, Encoding.GetEncoding("utf-8"))) 29 { 30 31 while (sr.EndOfStream == false) 32 { 33 string text = sr.ReadToEnd(); 34 35 EncryptedText = text; 36 37 38 } 39 } 40 41 //ここで復号実行 42 PlainText = DecS(EncryptedText,"passwordAAA"); 43 //D&Dしたテキストの中身そのまま表示=うまくいく 44 richTextBox1.Text = string.Format(EncryptedText); 45 //上で復号実行した内容表示=何も表示されない。。。 46 richTextBox2.Text = string.Format(PlainText); 47 } 48 } 49 50 private void Form1_DragOver(object sender, DragEventArgs e) 51 { 52 if(e.Data.GetDataPresent(DataFormats.FileDrop)) 53 e.Effect = DragDropEffects.Copy; 54 else 55 e.Effect = DragDropEffects.None; 56 } 57 58 59 private string DecS(string text, string pass) 60 { 61 System.Security.Cryptography.RijndaelManaged _rijndael = new System.Security.Cryptography.RijndaelManaged(); 62 63 byte[] _key, _iv; 64 GenerateKeyFromPassWord(pass, _rijndael.KeySize, out _key, _rijndael.BlockSize, out iv); 65 _rijndael.Key = key; 66 _rijndael.IV = iv; 67 68 69 70 System.Security.Cryptography.ICryptoTransform _decryptor = _rijndael.CreateDecryptor(); 71 72 byte[] _strByte = System.Convert.FromBase64String(text); 73 74 byte[] _decByte = _decryptor.TransformFinalBlock(_strByte, 0, _strByte.Length); 75 _decryptor.Dispose(); 76 77 78 79 return System.Text.Encoding.UTF8.GetString(_decByte); 80 } 81 82 public static void GenerateKeyFromPassWord(string pass, int keySize, out byte[] key, int blockSize, out byte[] iv) 83 { 84 byte[] _salt = System.Text.Encoding.UTF8.GetBytes("・・・"); 85 86 System.Security.Cryptography.Rfc2898DeriveBytes _deviceBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(pass, _salt); 87 _deviceBytes.IterationCount = 1000; 88 89 key = _deviceBytes.GetBytes(keySize); 90 iv = _deviceBytes.GetBytes(blockSize); 91 } 92 93 } 94 95 96} 97
https://teratail.com/questions/367147 は解決したのですか?
SurferOnWwwさん
ご質問ありがとうございます。
こちらはrijndaelにおいては「暗号化されたテキスト」と「復号プログラム」があれば「暗号化プログラム」を再構築することが可能ということで解決しております
テキストボックスに表示されないのが問題なのではなく、DecS()がちゃんと動作していないだけでは?
> //ここで復号実行
> PlainText = DecS(EncryptedText,"passwordAAA");
> //D&Dしたテキストの中身そのまま表示=うまくいく
> richTextBox1.Text = string.Format(EncryptedText);
> //上で復号実行した内容表示=何も表示されない。。。
> richTextBox2.Text = string.Format(PlainText);
のようなコードがあったら、「PlainText = DecS(EncryptedText,"passwordAAA");」の時点で正しくPlainTextに要望通りのstringを得ているか最初に確認するのが普通です。ここで空文字列だったりすれば当然テキストボックスに表示されるはずがありません。あと、直接関係ないでしょうが、string.Format(PlainText)などと、string.Format()は意味が無いのでは。(ありますか?)
あなたの回答
tips
プレビュー