Triple-DESでの暗号化について

このQ&Aのポイント
  • Triple-DES(3重DES)は、8byteのデータを2つの鍵を使用して暗号化する方式である。しかし、実際には16byteの鍵を1つしか使用しないため、誤解が生じている。
  • 質問者は、Triple-DESでの暗号化について疑問を持っている。仕様書には2つの鍵を使用して8byteのデータを暗号化すると書かれているが、Triple-DESでは実際には16byteの鍵を1つしか使用しないため、どのような意味を持つのか不明瞭である。
  • VB.netやC#.netのソースコードを参考にしても、8byteの値を暗号化しても16byteの値が生成されることが分かった。Triple-DESでは、8byteのデータを暗号化するために16byteの鍵を使用することが特徴的である。
回答を見る
  • ベストアンサー

Triple-DESでの暗号化について。

Triple-DESでの暗号化について。 ある仕様書に、 8byte値をTriple-DESで「Ka(8byte)」と「Kb(8byte)」の2つの鍵を使用して暗号化して作成された、8byteのデータをやりとりする。 とあるのですが、調べた所、Treiple-DESは16byteの鍵を1つしか使いません。 さらに、8byteの値を暗号化すると16byteの値が作成されてしまいます。 ------- Q1.普通の解釈で、2つの鍵を使って暗号化とは、以下の内どの意味なのでしょうか? -------  1.KaとKbを繋げて、鍵とする  2.Kaを鍵として暗号化した値を更に、Kbを鍵として暗号化する  3.別の解釈があるのでしょうか? ------- Q2.8byteの値を暗号化した場合、暗号化された値を8byteで取得する事は出来るのでしょうか? ------- ※VB.netやC#.netのソースがありましたら教えて下さい。 ※以下の2サイトの方法は試しましたが、16byteで暗号化されてしまいます。 http://dobon.net/vb/dotnet/string/encryptfile.html http://msdn.microsoft.com/ja-jp/events/dd252965.aspx

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

  • ベストアンサー
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

> Q1.普通の解釈で、2つの鍵を使って暗号化とは、以下の内どの意味なのでしょうか? トリプルDESは、文字通り、DESを三回施します。 K1を鍵としてDESで暗号化→K2を鍵として復号→K3を鍵として暗号化 という処理になります。 http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AA%E3%83%97%E3%83%ABDES あとは、暗号化ライブラリ次第ですが、後者(msdn.microsoft…)で挙げられている TripleDESCryptoServiceProvider では、 DESの2つないし3つのキーを連結したものを指定するようです。 http://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledes.aspx つまり、TripleDESCryptoServiceProvider を使う場合には、「1.KaとKbを繋げて、鍵とする」が答えになります。 一方、前者(dobon.net…)の方はトリプルDESではない普通のDESを使っているようです。今回の質問者さんの目的にはあいません。 (無印DESでも、上述のようにDESを3回使えばトリプルDES暗号化できますが、トリプルDESのライブラリがあるのですから、わざわざ無駄な手間をかけるよりはそっちを使うべきです) > Q2.8byteの値を暗号化した場合、暗号化された値を8byteで取得する事は出来るのでしょうか? DESに限らず、大抵の暗号化アルゴリズムでは、入力のサイズと出力のサイズは一致します。 つまり、平文が8bytesなら、それを暗号化した暗号文も8bytesになります。 推測になりますが、文字コードの問題で、平文が8文字がUnicode化して16bytesになってるとかいった可能性はありませんか?

aruki1108
質問者

お礼

回答ありがとうございました!解決しました。 DES暗号化のソースを参考にプログラムを作成し、回答頂いた方法でトリプルDES暗号化を行った所、目的の暗号化を行う事ができました。 ※参考にした、DES暗号化のソース http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleDES.html >推測になりますが、文字コードの問題で、平文が8文字が >Unicode化して16bytesになってるとかいった >可能性はありませんか? 上記の方法で実現できたので、もう少し形になった所で調査してみたいと思います。 Unicode化されているかも知れない発想は無くて、とても参考になりました。 ありがとうございました。

関連するQ&A

  • Triple DESについて

    C#でTriple DESを実装しております http://code.msdn.microsoft.com/10-C-70e9f385/ を参照しております キーと初期ベクタは、 TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider(); DesKey = TDES.Key; DesIV = TDES.IV; で与えられますが、具体的にはどのような値なのでしょうか? 何か意味のある値でしょうか? それとも、8バイトの乱数を発生させているだけなのでしょうか? ご指導よろしくお願いいたします

  • 3DESの強度

    2DES (Double DES) は man-in-the-middle-attack が可能なため、実際の鍵長は 112-bit であっても、普通の DES と同じ 56-bit の強度しかないと聞きました。 一方、3DES (Triple DES) では2つの鍵を使用するもの (EDE で2つの暗号化鍵が共通) と3つの鍵を使用するものがあり、それぞれの強度は 112-bit、168-bit となるとしているものもあれば、2DES 同様 man-in-the-middle-attack の影響を受けるため 112-bit しかないとしているものもあるようです。 実際のところ、2鍵 3DES と3鍵 3DES の強度はどのようになるのでしょうか?

  • 暗号アルゴリズム(DES,AESなど)について

    研究室の課題で暗号アルゴリズム(DES,AESなど)の勉強中なのですが、 少し分からないことがあるのでお詳しい方いらっしゃいましたら教えてください。 まず、DES, 3DES, AESのECBモードで暗号するときを考えます。 入力データ長と出力データ長が同じで、カギを変えない場合に 入力データと出力データは1対1になるのでしょうか? カギを変えずに、異なる入力データから同じデータが出力されることがあるかどうか知りたいです。 また、ある固定バイトのデータを同じ長さのデータに暗号化するときに どのような暗号方式が考えられる(世間的に強力とされている)のでしょうか? たとえば、4バイトのデータを暗号化して4バイトのデータを生成するような場合です。 条件として異なる入力データからは同じ出力データが生成されることがないとします。 アドバイスでも良いです。お願いします。

  • トリプルデス暗号化とLANカード

    LANカードのスペックに 「セキュリティ機能 MD5,SHA-1,DES,Triple,DESをハードウェアで実現」 と書いてあります。 このLANカードは設定でDESなどを使用するように設定できるのですか? もしそうでしたら、それを復号化するのはパケットの送信先のLANカードですか? 物理層を飛び交うパケットデータに、そのデータが暗号化されているかなどという情報はヘッダやトレーラに存在するのですか? 例えば下記のLANカードのスペックに暗号化のことが記載されています。 http://www.fmworld.net/biz/fmv/product/hard/card/fmv-1803s_1.html

  • VB.netでの暗号化復合化の鍵管理について

    Windows 7 Pro (64bit) VB.net 2010 Pro にてアプリ開発、暗号化複合化処理を実装しているところです。 作成するものは下記で、どちらもVB.netです。  1.暗号化ツール(自作  2.アプリ(自作 暗号化複合化処理は下記サイトを参考に行いました。 http://dobon.net/vb/dotnet/string/encryptfile.html システムの流れ ◆暗号化ツールについて  1.のツールで行います。  あるファイルを対象に暗号化し、そして、その暗号化されたファイルを出力し  2.のアプリに埋め込もうと考えています。  同時に、復号に使用する鍵(以下、「復号鍵」)もファイル出力します。 ◆復号化について  2.のアプリで行います。つまり暗号化と復号化の処理は1.2.で切り離されています。  ファイル内容を復号化(復号化された内容は文字列)し、  システム内部でそのファイル内容を使用したい。 ◆問題  復号化するからには、暗号化された復号鍵がどこかに添えてあげる必要があります。  【復号鍵の管理】に関して、どこに持つのがセキュリティ上最も安全か考えております。    折角暗号化したのにもかかわらず、復号鍵が目の見える場所にあっては、  アプリを解析などされた際などに、意味のないものになってしまいます。   何か良い策などあれば、参考にお聞かせ願えればと考えております。    ◆没案  下記の例では、コンピュータに長けている人であれば解析できそうな気がしたので  今回、私の作るシステムではアウトと考えています。  ・レジストリに格納    ・・・ レジストリエディタを使える人からすれば意味がない?    ・Windows上のローカル奥深くに隠しファイルとして保存    ・・・ そもそもディスクドライブにファイル保存すること自体がアウト?    ・USBなどの外部メディアに保存。システムを起動するときに指してもらう。   ・・・ 外部メディアの管理が必要になる。紛失時の問題にもなる。アウト。  ・サーバ上に、キーを持つ。   ・・・ この方法だと、そのサーバ情報もアプリに持つことになるので結局、そのサーバ情報も暗号化することに→イタチごっこに?アウト。 いろいろ考えて見てはいるのですが、いまいちピンときません。 そもそも解析されたら、などと考えるまでもなくこうすれば 鍵管理は問題ないという過去の事例などありましたら、ご教授願います。 よろしくお願いいたします。

  • 化学反応の速度定数

    A→Bという1次反応で、Aの減少速度をVa,Bの増加速度をVb,各々の速度定数をka、kbとすると、 Va=ka×[A]と表すことはわかるのですが、 Vb=kb×[A]と表すことができるのが何故なのか わかりません。Vb=kb×[B]では駄目なんでしょうか?この式でもOKなら当然kbの値は違ってきますが・・・。どなたか教えてください!緊急でお願いします!

  • java(1.4) 暗号化

    暗号化鍵が16byteの文字列ではなく 各byte10進数で表現された鍵を利用してAESの暗号化を実装する場合、 鍵はどう変換させて文字列に変えればいいでしょうか。 また、変える必要はなくそのまま利用するものなのでしょうか。 ネット上のサンプルを拝見しても、 全て鍵の文字列を利用してのサンプルであったため どのような考え方で実装できるのかかご教授宜しくお願いします。 参考URL:http://www.masatom.in/pukiwiki/Java/%B0%C5%B9%E6%B2%BD/

    • ベストアンサー
    • Java
  • DESを使用した暗号化/復号化処理について

    現在下記仕様でパラメータの暗号化複合化処理を作成していますが例外が発生して困っています。 方式:DES モード:CBC パディング:PKCS5Padding 秘密鍵:kagi1234 BASE64でエンコードしてString変換 【例外内容】 Exception in thread "main" java.lang.RuntimeException: java.security.InvalidKeyException: Parameters missing at enc.Main01.decrypt(Main01.java:114) 【ソースコード】 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Encoder; public class Main01 { public static void main(String[] args) { try { String val1 = encrypt("10000", "key12345"); System.out.println(decrypt(val1, "key12345")); } catch (Exception e) { e.printStackTrace(); } } public static String encrypt(String text, String secretKey) throws Exception { SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(), "DES"); Cipher cp = Cipher.getInstance("DES/CBC/PKCS5Padding"); cp.init(Cipher.ENCRYPT_MODE, sks); return new BASE64Encoder().encodeBuffer(cp.doFinal(text.getBytes())); } public static String decrypt(String decValue, String secretKey) throws Exception { SecretKeySpec sks = new SecretKeySpec(secretKey.getBytes(), "DES"); byte[] decArr = new sun.misc.BASE64Decoder().decodeBuffer(decValue); Cipher cp = Cipher.getInstance("DES/CBC/PKCS5Padding"); cp.init(Cipher.DECRYPT_MODE, sks); return new String(cp.doFinal(decArr)); } } 対処方法がも解らず自力解決は困難です。 お手数ですが解決方法を御教授願えないでしょうか? よろしくお願いします。 環境(WidowsXP SP2, JDK1.5.0_07-b03)

    • ベストアンサー
    • Java
  • テキストの暗号化

     VB6.0のwriteステートメントでテキストファイルを作成し、 VB.NETのStreamReaderで読み込むプログラムを書いています。  暗号化とまではいかないまでも、このプログラムに少し手を加えて、 作成したテキストファイルをメモ帳やワードパットなどでは読めないようにしてみたいのです。  実際にどのような方法があるのかと、その具体的な手順をご教授頂ければ幸いです。  ちなみに当方、素人に毛が生えた程度のレベルです。  よろしくお願いします。

  • RSA暗号化の方法(具体的に)

    C++で、あるファイルを暗号化するプログラムを作成しようと思っています。 暗号はRSAで、と思っていますが、どのようにすればいいのか分かりません。 暗号自体のアルゴリズムは理解しているのですが、 「具体的に」どうすればいいのか教えて欲しいのです。 「文字」とか、そういう単位がなくて、単なるディスクファイル、またはメモリ上の bit列があったときに、それをどうやって暗号化するか、また復号するか。 鍵が分かったとして、bit列のどこからどこまでを1つの単位として計算するのか。 その暗号化単位は、公開鍵だけで判断できるのか。 素数で割った余りなので、1つの数字としてみたときに素数より小さい数でないと だめなことは分かります。 もしかしたら、このようなデータの暗号化は、他のアルゴリズムを 使用した方がいいのかもしれませんが、暗号について あまり詳しくないので、どうしたらいいのか分かりません。 ネットで調べた内容では、アルゴリズムは理解できても、 対象としているデータで、実際どうやるのか分かりませんでした。 よろしくお願いします。