- PR -

復号かの失敗を判断する方法について

1
投稿者投稿内容
Kit
会議室デビュー日: 2005/08/19
投稿数: 12
投稿日時: 2006-07-17 13:29
お世話になります。あるビット列中の中にある固定の長さのデータだけを暗号化してもとのビット列中に埋め込みその部分を復号化した際に何らかの影響で復号化の失敗がおきたとき復号かの失敗がおきたと判断する方法について考えているのですが良い方法が思いつきません。
よろしければ皆様の知恵をおかりできませんか?前提としては平文をみないで復号化の失敗を判断したいです。(無理があるかもしれませんが...)

例えば、128Bytesあるデータの12Bytes分を暗号化して暗号化したデータを128Bytesの中の12Bytes分に戻します。

例)
128Bytesのデータ
------GFFFDAGFHDDS---------------------------------(128Bytes)


128Bytes中の12Bytes部分
GFFFDAGFHDDS


128Bytes中の12Bytes部分を暗号化
HGDDSSWQUYRR


128Bytesのデータ中に12Bytes部分を暗号化したデータを埋め込む
------HGDDSSWQUYRR---------------------------------(128Bytes)


復号化を行う
------GFFFDAGFHDDA---------------------------------(128Bytes)



復号化に失敗している
正しい平文             GFFFDAGFHDDS
間違っている復号化した平文  GFFFDAGFHDDA

これをどのように検知するのか?

案1
@暗号化をかける前に何らかの圧縮を行い11Bytesにして11Bytesからハッシュ関数等を使ってハッシュ値を求めておき
そのハッシュ値を残りの1Byteに代入する。

A.1 元の平文(12Bytes)              GFFFDAGFHDDS

A.2 何らかのアルゴリズムを用いた圧縮後(11Bytes)  GF3DAGFHD2S

A.3 何らかのハッシュ関数を使い1Bytes分を埋める GF3DAGFHD2S9

A.4 暗号化を行う                  JKHHDDWERYUE

A.5 復号化する                   GF3DAGFHD2S9

A.6 何らかのハッシュ関数を使いハッシュ値が正しいか確認する
GF3DAGFHD2S ⇒ 9を求めた
9(求めたハッシュ値) = 9(復号化の際に最終Byteにあった値)

A.7 よって正しく復号化できている

A.8 圧縮を解凍する                GFFFDAGFHDDS


但し、この案は無理があるようです。安定して1Byte分圧縮する方法が見当たらないので。

とここでもういきず待ってしまっています。
暗号化のプロの皆様よい案はありませんか?
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-07-17 14:14
チェックに利用するための冗長なデータが予め入力データに含まれているか
どこかに挿入するかしない限りは、不可能です。

そもそも、「復号に失敗する」可能性があるということ自体が問題なのでは?

12Bytesの冗長性を含まないデータを暗号化して12Bytesの結果を得る。
入力にすべてのビットパターンが出現し得るなら、暗号化の結果もすべての
ビットパターンを覆う必要があります(でなければ、復号できない)。
したがって、12Bytes長の任意のデータが復号できるはずです。
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-07-17 21:05
引用:

Kitさんの書き込み (2006-07-17 13:29) より:

とき復号かの失敗がおきたと判断する方法について考えているのですが良い方法が思いつきません。




HMACでいいのでは。

http://www.atmarkit.co.jp/fnetwork/rensai/cell03/ssl3.html

のように、暗号文の「完全性」チェックに使えます。

それ以上のMAC(Message Authentication Code)を作ろうと?
もちっと簡単にしてもいいですけど、、

わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-07-17 21:34
すでに、ファイルのフォーマットが固定長で決まってしまっているという事なのでしょうか?

もし、そうであれば coasm さんのおっしゃるように不可能です。

基本的な考え方は、Kit さんの考え方で正しいので、なんとかしてチェック用のバイトをどこかに埋め込む事を考えるしかありません。

他には、それぞれの文字が ASCII コードで、20h 〜 7Eh ぐらいの範囲である事が分かっていれば、それをチェックに使うことも可能かもしれません。

正しく復号されていないのに、12byte のデータがすべて 20h 〜 7Eh の間に含まれる確率は、10万分の1 以下なのでチェックに 1byte つけるよりは高い精度で複合化のチェックができます。

これは例ですが、他にも元データの特性に偏りがあれば、それをチェックするだけでかなりの確率で誤って復元された事をチェックできると思います。
Kit
会議室デビュー日: 2005/08/19
投稿数: 12
投稿日時: 2006-07-17 22:26
coasmさん、加納さん、わちゃさん返信ありがとうございます。(^_^)

coasmさんへ

>チェックに利用するための冗長なデータが予め入力データに含まれているか
>どこかに挿入するかしない限りは、不可能です。
そうですか。一応私も無理かなと思っていましたが....。

>そもそも、「復号に失敗する」可能性があるということ自体が問題なのでは?
色々と理由がありまして....理由はちょっとお話できませんが...。


>12Bytesの冗長性を含まないデータを暗号化して12Bytesの結果を得る。
>入力にすべてのビットパターンが出現し得るなら、暗号化の結果もすべての
>ビットパターンを覆う必要があります(でなければ、復号できない)。
>したがって、12Bytes長の任意のデータが復号できるはずです。
ここでの意味をまとめると情報冗長(パリティビット等)を含めずに12Bytesを暗号化して128Bytesに戻し128Bytes全体を暗号化してから128Bytesを復号化してさらに12Bytesを復号化すればいいということを言っていると理解しましたがあっていますか?



加納さんへ
HMACの記事ありがとうございます。早速読んでみます。
あと残念ながらMAC以上の理論を組み立てるまでの実力がありません。
いつかは自分自身で暗号理論を組み立ててみたいのでもっと勉強しないとですね。



わちゃさんへ
ファイルは固定長で決まっています。たしかに色々と意見をきいていると無理だと分かりましたが、自分の興味がある分野なのでもう少し自分で調査してみます。
またデータに偏りがでないかも調査してみます。
ありがとうございます。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-07-17 23:02
引用:

12Bytesの冗長性を含まないデータを暗号化して12Bytesの結果を得る。
入力にすべてのビットパターンが出現し得るなら、暗号化の結果もすべての
ビットパターンを覆う必要があります(でなければ、復号できない)。
したがって、12Bytes長の任意のデータが復号できるはずです。



すみません。
自分で読み返してみても意味不明ですね。
言いたかったことは、
冗長性のない暗号の場合、元の平文と暗号文はまったく同じ情報量を持っているので、
なにか問題があったとしても元と違う平文を復元してしまうだけだ、ということです。
それが「元と違う」ことを確認する手段は、復号側にはありません。

Kit
会議室デビュー日: 2005/08/19
投稿数: 12
投稿日時: 2006-07-18 23:16
coasmさんへ

分かりました。わざわざ回答ありがとうございます。
1

スキルアップ/キャリアアップ(JOB@IT)