復号化について

[戻る]
GG 2007/07/17(火) 10:04:31
いつもお世話になっています、GGです。

前回の質問(文字列のバイナリ化)を続けてします。
すみません、新たに問題が出ました。

復号化の質問です。

暗号化後保存しました。プログラムを閉じします。
再びプログラムを起動します。
問題:
復号化するときに乱数の発生(randValue[ra_i])は暗号化するときにと違っています、
暗号化randValue[ra_i])!= 復号化(randValue[ra_i])
つまり、
復号化するときに暗号化と同じ乱数を得るのは、どうしたらいいでしょうか。

よろしくお願いします。

επιστημη [HomePage] 2007/07/17(火) 10:31:16
暗号化時にどんな乱数でかき混ぜたのか(乱数の種)を
"どこかに"残しておくしかないんじゃないすか?
たとえばファイルの先頭だとか。

GG 2007/07/17(火) 11:16:08
επιστημη さん
ご返事ありがとう.

>暗号化時にどんな乱数でかき混ぜたのか(乱数の種)を
>"どこかに"残しておくしかないんじゃないすか?
>たとえばファイルの先頭だとか。

”乱数の種”というのは、srand(seed);
にseedの値ですね、
例:
seed=50;
srand(seed);

seedをファイルに埋め込みます。読む時に先にこの数値を
読んで乱数を作成するということですね。
一つの問題があります、
OSが変わっている場合はその乱数が変わっていないでしょうか。
(OSはVistar、XP、2000など、各バージョン)

よろしくお願いします。

επιστημη [HomePage] 2007/07/17(火) 11:17:25
それが気になるなら乱数生成ルーチンを自作するがいい。

たいちう 2007/07/17(火) 11:32:07
> OSが変わっている場合はその乱数が変わっていないでしょうか。
> (OSはVistar、XP、2000など、各バージョン)

コンパイラのバージョンやコンパイルオプションによると思う。
OSによっては多分変わらないと思うが、実装が公開されていない関数では、
OSによって変わることもありうる。

乱数の種だけを保存して復号しようというのは、
ごく限定的な場合を除いてやるべきではないでしょう。

オレンジフィッシュ 2007/07/17(火) 12:20:48
前回の 2007/07/14(土) 21:37:42 で

>※RnadInit()、Rand() は自分で用意して下さい。
>※標準ライブラリの srand()、rand() でも良いですが処理系を変えてしまうと
> 復元出来なくなるかもしれない。バージョンによっても出来なくなるので自作すべ
> し。

と注意書きを残していたのに…。
記憶に残らなかったのね。残念。

GG 2007/07/18(水) 09:33:14
επιστημη さん、たいちうさん、オレンジフィッシュさん
ご返事ありがとう.

>それが気になるなら乱数生成ルーチンを自作するがいい。

自作乱数をできました。乱数発生の初期値(種)をファイルに書き込みました。
復号もうまくできました。

>と注意書きを残していたのに…。
>記憶に残らなかったのね。残念。

当時はその問題が考えていないです。すみませんでした。

>乱数の種だけを保存して復号しようというのは、
>ごく限定的な場合を除いてやるべきではないでしょう。

どういう意味でしょうか、
初期値(種)をファイルの頭部に保存したのですが、
それがよくないということでしょうか。


よろしくお願いします。

たいちう 2007/07/18(水) 10:17:17
> どういう意味でしょうか、
> 初期値(種)をファイルの頭部に保存したのですが、
> それがよくないということでしょうか。

コンパイラの用意したrand()関数は、プログラマにとっては
ブラックボックスです。同じ種から同じ乱数列が発生されることは
保証されていません。

同じバージョンのコンパイラで、同じコンパイルオプションなら、
多分、同じ乱数列が得られると(私は)思うので、多分、種と暗号化した
データだけの保存でも、多分、復号できると(私は)思います。

「多分」が気にならなければ、そのままで良いですし、
気になるなら自前のrand()関数を作って、同じ種から同じ乱数列
が得られることを自分で保証してください。
私なら自作します。

GG 2007/07/18(水) 10:57:32
たいちうさん、
ご返事ありがとう.

>コンパイラの用意したrand()関数は、プログラマにとっては>私なら自作します。
わかりました。

今回の自作乱数はrand()を使わないで、

rndnum=(rndnum*109+1021)%255;
ということです。

次に、解読の問題ですが、いつか不明点があります。

>麩 2007/07/15(日) 16:08:21
>1、乱数列を毎回変更する
>2、構造体の保存順序を毎回乱す。

以上は、一回暗号化一回復号ということですが、
もし、2回暗号化にして、2回復号にするということにすれば、
解読は難しくなるでしょうか。
(やったことがないので、推測)

もう一点は、dllなどファイルはどう暗号化しているのでしょうか、
(解読が不可能に近くなっている)

よろしくお願いします。

たいちう 2007/07/18(水) 12:10:22
> 以上は、一回暗号化一回復号ということですが、
> もし、2回暗号化にして、2回復号にするということにすれば、
> 解読は難しくなるでしょうか。
> (やったことがないので、推測)

どのような暗号化を考えているのかわかりませんが、
シーザー暗号の類だったら回数は多分無意味。
そうでなければ、少しだけ有効。

前のスレでも皆さん書いていますが、
小手先の暗号化は簡単に解読されると考えた方が良いでしょう。
気休め以上のものを求めているならば、こんなところで
質問しても無駄です。そのような技術は商品ですから。


> もう一点は、dllなどファイルはどう暗号化しているのでしょうか、
> (解読が不可能に近くなっている)

ソースファイルが暗号化されてexeやdllになっているわけでは
ありませんよ。コンパイルされてexeやdllになっているのですよ。
それともUPXのような話?

tetrapod 2007/07/18(水) 12:18:10
> 解読は難しくなるでしょうか。
この辺はコストパフォーマンスの問題にすぎない。
暗号・難読化の処理を複雑に行うにはそれなりのコストがかかる。
素人考えの処理をいくら施しても、技術ある人間がその気になったなら
有限時間のうちに解読されうるし、
ごく単純な処理であっても、分析の意欲・興味をそらす程度には有効かもしれない。
ビットを1/0反転するだけでも十分という意見は既に出てたよね。

# 無線 LAN のただ乗りを考えてみればいい。
# WEP 暗号は解読できるとされているが、解読の手間をかけるくらいならば
# 単純に場所を移動して無暗号なアクセスポイントを探すほうが手間がかからない。

その辺興味あれば 3DES とか obfuscator とか調べてみるといいだろうね。

GG 2007/07/19(木) 14:40:05
[[解決]]
たいちうさん、tetrapodさん
ご返事ありがとう.

暗号化と復号化に関するの知識は足りないですが、
皆さんのご意見を聞きながら、あー、あるほど、
丸で別の世界気がします。

結論としては、難読化程度しかないですね。
(次にやる気がないです。)
仕方ない、この程度でやめます。


ありがとうございました。

ITO 2007/07/19(木) 17:21:40
 暗号化で調べてみるとフリー・パッケージ等
いろいろなツールがあるみたいです。
 調べてみるのもいいと思います。

# DLLで提供しているのもありました。

yoh2 [E-Mail] 2007/07/19(木) 23:03:24
ふと気になったことが。

と、その前にリンク。
前スレ: 「文字列のバイナリ化」
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200707/07070018.txt

今までの話の流れ(前スレも含めて)から、GGさんが行いたいことは、

1. 暗号化されるもの:
アプリケーションが入出力するファイル。(*ファイルフォーマット*を知られたくない)

2. 暗号化を行う主体(=秘密鍵を決める者)
アプリケーションの作者。(GGさん?)

3. 誰に対して復号を許可するか:
アプリケーションのユーザー。

4. 避けたいこと:
アプリケーションを使わずにファイルが読み書きされること。
たとえアプリケーションのユーザーだとしても、アプリケーションを介さずに読み書きされたくない。

5. その他:
暗号化/復号部分は、実行ファイルやDLLなどの形でユーザーの手元にある。(?)

だと思っていましたが、これでよろしいのでしょうか。
現在の、暗号化を行うことに否定的な話の流れは、GGさんの目的が上記の通りだ、ということが前提になっ
ています。
# 5が成立しないなら、まだ可能性はあるかも。


もしそうではなく、

1'. 暗号化されるもの:
アプリケーションが入出力するファイル。(ファイルに書かれている*内容*を知られたくない)

2'. 暗号化を行う主体(=秘密鍵を決める者)
アプリケーションのユーザー。

3'. 誰に対して復号を許可するか:
アプリケーションのユーザーと、ユーザーが許可した者。

4'. 避けたいこと:
ユーザーが許可した相手以外にファイルが読み書きされること。
ファイルを暗号化したユーザーがアプリケーションを介さずに読み書きされることは(モラル上、またはラ
イセンス上NGだとしても)セキュリティ上の脅威ではない。

5'. その他:
特に条件はなし。

だとしたら

> 暗号化で調べてみるとフリー・パッケージ等
>いろいろなツールがあるみたいです。

という状況を利用すれば、独自の暗号化を考えるだとか、適当な難読化で済ますなどよりも楽で、しかもよ
り強固な暗号化が実現できます。
逆に、1'〜5'ではなく、1〜5が正解だとしたら、たとえ強固とされる暗号化アルゴリズムを適用したとし
ても、結局難読化にしかならないのではないか、というのが私の意見。(5が致命的。攻撃者に秘密鍵を知ら
れる可能性大)

GG 2007/07/20(金) 11:30:01
ITOさん、yoh2さん
ご返事ありがとう.

yoh2さんからのコメント:

>1. 暗号化されるもの:
>アプリケーションが入出力するファイル。(*ファイルフォーマット*を知られたくない)

OK

>2. 暗号化を行う主体(=秘密鍵を決める者)
>アプリケーションの作者。(GGさん?)

OK、わたしです。

>3. 誰に対して復号を許可するか:
>アプリケーションのユーザー。

OK、

4. 避けたいこと:
アプリケーションを使わずにファイルが読み書きされること。
たとえアプリケーションのユーザーだとしても、アプリケーションを介さずに読み書きされたく
ない。

OK,そのファイルの一部に個人情報があります。アプリケーション以外は読み書き禁止。
万が一、流失すると解読しにくい。

>5. その他:
>暗号化/復号部分は、実行ファイルやDLLなどの形でユーザーの手元にある。(?)

NO

>5'. その他:
>特に条件はなし。

OK

以上、1,2,3,4、OK; 5.NO;
5’OK;
です。

一番希望したいのは、強固な暗号化。
解読率は20%以下にしたい。(解読プロの方が除外)

よろしくお願いします。

yoh2 [E-Mail] 2007/07/22(日) 21:35:55
> 以上、1,2,3,4、OK; 5.NO;
> 5’OK;
> です。

5が成り立たないなら、1' 〜 5'の場合と同様に既存の暗号化アルゴリズムが利用できそうですね。
あとはGGさんが決めた秘密鍵が*絶対に*バレないように運用に注意しましょう。

GG 2007/07/23(月) 08:55:26
yoh2さん、
ご返事ありがとう。

>5. その他:
>暗号化/復号部分は、実行ファイルやDLLなどの形でユーザーの手元にある。(?)

暗号化/復号化したファイルはアプリケーションの起動するときに使いますから、
やっぱり、その暗号化/復号化したファイルとアプリケーションを一緒にユーザーへ
渡しますので、5が合っています。
結局、難読化しかないですね。
残念なことです。

> 暗号化で調べてみるとフリー・パッケージ等
>いろいろなツールがあるみたいです。
> 調べてみるのもいいと思います。
>
># DLLで提供しているのもありました。

探します、どこまで解消できるかなー?

ありがとうございました。

GG 2007/07/24(火) 09:10:23
追記:

すみません、確認です.

>5. その他:
>暗号化/復号部分は、実行ファイルやDLLなどの形でユーザーの手元にある。(?)

暗号化したファイルはユーザの手元にあります。
復号部分はアプリケーションを起動しないと解読できない。
(復号部分はアプリケーションにあります)

ということです。

5が合っているかなー。

よろしくお願いします。

たいちう 2007/07/24(火) 11:20:34
5の条件に該当します。

ここで、アプリケーションが復号するのでなく、
ユーザーのCPUが復号すると考えてみてください。
するとアプリケーション(の一部)は、暗号解読マニュアルです。

擬人化されたCPUが暗号と解読マニュアルを渡されて復号します。
暗号はそれだけでは解読不能かもしれませんが、
解読マニュアルは、CPUにとって単なるマシン語ですので、
すらすら読めるから、復号可能なのです。

さて、この過程は、デバッガがあれば人間が追跡することができます。
ソースコードもオブジェクトファイルも必要なく、
実行ファイルだけでもデバッグできます。
もちろん、ソースコードはないので、アセンブリ言語上での
デバッグになりますが、原則としてガラス張りなのです。

素人ではデバッガを使いませんし、私のような毛が生えた程度の人だと
複雑すぎてデバッガを使っても手の出しようがない場合が多いです。
最近また流行りだしたルービックキューブはガラス張りですが、
誰でも解けるわけじゃないことに少し似てるかも。
ですが上級者のレベルは桁違いのようです。魔法使いと思っておきましょう。

興味をお持ちならば、一度書籍などで勉強してはどうでしょう。
掲示板で聞くより、(概要については)よっぽど早く習得できると思いますよ。

GG 2007/07/24(火) 17:26:32
たいちう さん
ご返事ありがとう。

>5の条件に該当します。
>…
>するとアプリケーション(の一部)は、暗号解読マニュアルです。

わかりました。

>ですが上級者のレベルは桁違いのようです。魔法使いと思っておきましょう。
恐ろしいですね、そういうことなら、市販のソフトも解読されるようね。


>興味をお持ちならば、一度書籍などで勉強してはどうでしょう。
>掲示板で聞くより、(概要については)よっぽど早く習得できると思いますよ。

趣味がないので、ただ、自分で暗号したものがどこまで解読されるかということです。
アドバイスありがとう。

いろいろを聞いてもらって、ほんとにありがとうございました。

古いスレッドには追加発言できません。