• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:画像(jpg)⇒暗号⇒文字列(txt)⇒復号⇒画像(jpg)をやりたい)

画像を暗号化して文字列に変換し、復号して画像に戻す方法

このQ&Aのポイント
  • 画像(jpg)をテキストに変換し、指定のURLの暗号メソッドを使用して変換した文字列をテキストで保存します。そして、復号の際にはテキストを取得して指定のURLの復号メソッドを使用し、変換した文字列を再び画像(jpg)に保存します。
  • しかし、暗号する前後で変換される文字列が異なる問題が発生しています。原因として、復号したファイルの拡張子をjpgにしていることや、文字列をテキストに書き込む際に文字コードの不具合が生じている可能性が考えられます。
  • 解決策としては、復号したファイルの拡張子を正しく処理することや文字コード関連の問題を修正する必要があります。また、画像をテキストとして処理する際には適切な方法で処理することが重要です。C#を使用する場合、文字列や画像の変換に適したライブラリやメソッドを活用すると良いでしょう。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

最初の「画像を文字列で取得して、」のくだりが良くわかりません。 JPGファイルをC#で文字列型に読み込んだ という意味ですか? もしそうならば、最初からバイナリデータとして読み込むように変更しましょう。 > http://dobon.net/vb/dotnet/string/encryptstring.html に掲載されているソースを拝見しますと、文字列からバイナリの取り出しに、 System.Text.Encoding.UTF8.GetBytes をいう処理を行っています。ここで文字コード変換がかかっているかもしれません。 あるいは、一度ファイルに書き出す際に、文字として表現できないデータが失われているのかもしれません。 バイナリ・ファイルを読み書きするには?[C#、VB] - @IT http://www.atmarkit.co.jp/fdotnet/dotnettips/669bincopy/bincopy.html

HKKMR
質問者

お礼

色々調べた結果、System.Convert.ToBase64というのにたどり着きました。 以下が画像を文字列で読み込んで、書き込みを行なうサンプルです。 //Base64で文字列に変換するファイル string inFileName = @"test.jpg"; System.IO.FileStream inFile; byte[] bs; //ファイルをbyte型配列としてすべて読み込む inFile = new System.IO.FileStream(inFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read); bs = new byte[inFile.Length]; inFile.Close(); //Base64で文字列に変換 string base64String = System.Convert.ToBase64String(bs); //バイト型配列に戻す byte[] bs = System.Convert.FromBase64String(base64String); outFileName = @"test2.jpg"; //ファイルに書き込む System.IO.FileStream outFile = new System.IO.FileStream(outFileName,            System.IO.FileMode.Create, System.IO.FileAccess.Write); outFile.Write(bs, 0, bs.Length); outFile.Close(); あとは文字列に変換した『base64String』を暗号して復号して、 バイト型配列に戻して、画像を作成しましたが、ちゃんと表示されました。 お世話になりました。 ご回答ありがとうございました。

その他の回答 (1)

  • Yorisin
  • ベストアンサー率54% (364/663)
回答No.1

jpegなどのデータをそのまま文字列として扱うことは不適切です。 文字として存在しないデータや、文字として扱うと特殊な意味を持つデータがほぼ確実に含まれています。 どうしても文字列の暗号化をしたいのであれば、 まず最初にバイナリデータを文字データに変換する事が必要です。

HKKMR
質問者

お礼

バイナリで作ってもと思ったのですが・・・やはり文字列でできないか考えました。 で、色々調べた結果。。。 System.Convert.FromBase64が解決してくれました。 ご回答の程ありがとうございました。