web-dev-qa-db-ja.com

opensslを使用した小さなファイルの暗号化と復号化

「内部」キーを使用して、小さなテキストファイルを読み取り、暗号化する小さなプログラムをC/C++で記述したいと思います。次に、内部的に同じキーを使用して暗号化されたファイルを復号化できる別の小さなプログラムも書きたいと思います。

私はopenSSLサイトとグーグルを見ましたが、単純な例ではありませんでした、誰かがこれをやろうとしたことがありますか?

22
Werner

理想的には、ccryptなどの既存のツールを使用できますが、次のようになります。

#include <openssl/aes.h>

/* ... */


{
  int bytes_read, bytes_written;
  unsigned char indata[AES_BLOCK_SIZE];
  unsigned char outdata[AES_BLOCK_SIZE];

  /* ckey and ivec are the two 128-bits keys necesary to
     en- and recrypt your data.  Note that ckey can be
     192 or 256 bits as well */
  unsigned char ckey[] =  "thiskeyisverybad";
  unsigned char ivec[] = "dontusethisinput";

  /* data structure that contains the key itself */
  AES_KEY key;

  /* set the encryption key */
  AES_set_encrypt_key(ckey, 128, &key);

  /* set where on the 128 bit encrypted block to begin encryption*/
  int num = 0;

  while (1) {
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp);

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num,
           AES_ENCRYPT);

    bytes_written = fwrite(outdata, 1, bytes_read, ofp);
    if (bytes_read < AES_BLOCK_SIZE)
  break;
  }
}

復号化は、最後のパラメーターとしてAES_cfb128_encryptを使用してAES_DECRYPTを呼び出すことによって行われます。このコードには、最も基本的なテスト以上のものは与えられておらず、ckeyとivecには適切な8ビットのランダムデータを実際に使用する必要があります。

[〜#〜] edit [〜#〜]AES_cfb128_encryptは任意の長さのデータを受け入れるようなので、AES_BLOCK_SIZEのブロックで暗号化する必要はありません(16 )バイト。

21

以前の回答は、あなたが要求したことを行う方法にあなたを向けていました。

理由を追加したいと思います

あなたが話していることは「対称暗号化」と呼ばれます(1つのキーで暗号化されたすべてが特定の相手によってのみ復号化できる非対称暗号化とは対照的に、暗号化と復号化には同じキーが使用されます)。

実行ファイルを逆アセンブルして、使用されているハードコードされたキーを特定するのは簡単です。つまり、実行可能ファイルの1つを手にした人は誰でも、これまで交換されたメッセージの暗号化を破ることができます。

あなたが考えているアプリケーションが非常に具体的でない限り、これはあなたのセットアップが安全に「見える」かもしれないがそうではないことを意味します。これらの場合、通常はまったく暗号化しない方が良いので、関係する誰もその誤った安心感に陥らないようにします...

(自分でアルゴリズムを実装/作成する代わりに)標準ライブラリを使用して暗号化を行うのは非常に良いことですが、protocollhowアプリケーション、キー、およびメッセージが使用および交換される)は、少なくとも暗号自体と同じくらい重要です。弱点を伝えるために、暗号を扱う誰かに自分のアイデアをテストしてもらいたいと思うかもしれません。 (私はここStackOverflowでその種の十分なものがあると確信しています。;-))

13
DevSolar

OpenSSLは、ネットワークを介してデータを暗号化するためのプロトコルであるSSLおよびTLSの実装に特に関係しています。ファイルを暗号化しようとしているだけなので、OpenSSLを使用することは可能ですが、理想的ではありません。

代わりに、私は BeeCrypt または Crypto ++®Library 5.6. のようなものを使用します。どちらも使用例を提供します。

1
Andrew Austin