8


5

私の問題は以下の通りです:

既存のデータベースでは、2列に分けてデータを暗号化したいと思います。 列には長さの異なる文字列が含まれています。

暗号化によって入力テキストと同じ長さのテキスト表現を生成する必要があるため、列のサイズを変更したくありません。

暗号化アルゴリズムの強さは二次的な関心事ですが、もちろんそれを可能な限り強くしたいと思います。 それ以外の場合、データを暗号化する必要はありません。 しかし最も重要なことは出力のサイズです。

これは可能ですか? もしそうなら私はそれをどのようにやりますか?

私は.NETでそれに興味があります。 データベースレベルの暗号化はありません。

8 Answer


15


あなたの制約の中で、私はそれをストリーム暗号に変える CFBモードでAESを使うでしょう、そして出力長は入力長と同じになるでしょう。 文字列をBLOBに格納しているのでなければ、出力を16進またはbase64でエンコードして文字にやさしくする必要があります。これは100%または33%の長さの増加になります。

http://www.codeproject.com/KB/security/csstreamcipher.aspx[1つの.NETの実装]はこちらです。


2


少し時間をかけて、解決しようとしている実際の問題について考えてください。 情報がデータベースからエンドユーザーに直接流れることはめったにないので、データベースの暗号化が本当に必要な場合はほとんどありません。

データベースのコンテンツを保護する必要がある場合は、代わりにその標準的なアクセス制御メカニズムを調べてください。


2


安全な暗号化は暗号文が平文より大きいことを必要とします。そうでなければ、同一の平文は常に同一の暗号文となり、無効な暗号文のようなものはなく、どちらも弱点です。

ただし、暗号化しているデータを本当に拡張できない場合は、調整可能なブロックモードが最善の方法です。 ディスク暗号化に使用されるXTSとCMCモードを調べます。


1


暗号化された文字列はプレーンテキストよりも多くの情報を保持していると思われるため、これは通常不可能です。

あなたの問題を解決するためのあいまいなアイデア: - より短いテキスト文字列にあなたの番号をマッピングしてください:2桁は1文字にマッピングすることができます。
- あなたは最初のx桁を暗号化することを避けることができますか?
- テキストではなく整数としてそれを暗号化するための可能性は何ですか?


1


あなたは微調整可能なブロック暗号を探すかもし​​れません。 行に一意の識別子がある場合(例: その場合は、一意の識別子を微調整として使用できます。 この種の暗号化の利点は、暗号化をランダム化するためにIVを必要としないことです。 列に同じ値が複数回含まれている場合でも、微調整により、この値の暗号化方法は異なります。

安全性の低い解決策は、カウンタモードでブロック暗号を使用し、カウンタを計算するために一意の識別子を使用することです。 しかし、このモードには深刻な欠点があります。一意の識別子も変更しない限り、フィールドを安全に再暗号化することはできません。

どちらの場合も暗号文がランダム化されないため、攻撃者は特定のフィールドが変更されたかどうかを確認できる可能性があります。 これはいくつかの貴重な情報を漏らすかもしれません。 また、どちらの場合もデータの整合性が得られないことにも注意してください。 攻撃者が情報を復号化できない場合でも、彼はそれを自分の利点に変更できる可能性があります。


0


http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher[Vigenère暗号]はそれをすることができます。 しかし、それは古く(プレコンピュータ)、あなたのキーフレーズが暗号化したい最長の文字列より長い場合にのみ安全です。 さらに、同じキーフレーズで暗号化された文字列でデータベースがいっぱいになっていると、特に平文が推測できる場合は、おそらく1週間で暗号化されます。

これは、シーザーシフトアルゴリズム(プレーンテキストの各文字にnを追加する)とほぼ同じように機能しますが、キーフレーズに基づいて、変更する文字ごとにnが異なる点が異なります。

あなたのキーフレーズがABCDEFGであるならば、それは入力の最初の文字のためのn = 1、2の入力文字のための2などを意味します。

プレーンテキストより長いランダムキーフレーズの場合、出力はまったく同じようにランダムになります(安全)。 しかし、私はあなたが同じキーで暗号化された多くの文字列を持っているならこれが故障すると思います。 ..


0


どのブロック暗号でも構いません。 基本的には、固定長ブロックを入力して、同じサイズの暗号化ブロックを返します。 暗号は、\ {0、…​、2 ^ blocklength}から\ {0、…​、2 ^ blocklength}の順列です。 (入力長はブロック長境界に埋め込む必要があります。)

ここでの問題は、列がテキストの場合、必ずしもその中にバイナリ暗号テキストを入れることができず、データをbase64(33%サイズの増加)などのテキスト形式にエンコードする必要があることです。

AESは広く利用されているブロック暗号規格です。


0


理想的には、既存の列が標準ブロック暗号の単一ブロックより大きい場合(AESの場合は16バイト、TDESの場合は8バイト)、http://msdn.microsoft.com/ja-jp/library/で暗号化できます。 system.security.cryptography.ciphermode.aspx [CTS(暗号化テキストの盗用)モード] 残念ながら、.netは含まれているアルゴリズムのどれでもCTSをサポートしていません。 :-(

通常、CTSは暗号文と一緒に格納する必要があるランダムIVを使用しますが、同一の平文値を同一の暗号文に暗号化してもかまわない場合は、行IDまたは定数値を使用することもできます。