時計を壊せ

駆け出してからそこそこ経ったWebプログラマーの雑記

JavaでDH鍵交換の初期化ベクトルを生成する

20億のデバイスでDH鍵交換の初期化ベクトルを生成できます。
以下のような具合のJavaコードをCreateDiffieHellmanIv.javaとして保存しましょう。

import java.security.AlgorithmParameterGenerator;
import javax.crypto.spec.DHParameterSpec;

public class CreateDiffieHellmanIv {
    public static void main (String[] args) throws Exception {
        int bitlen = 1024;
        if (args.length == 1) {
            bitlen = Integer.valueOf(args[0]).intValue();
        }
        System.out.println("Generating DiffieHellman initialization vector... " + "bitlen:" + String.valueOf(bitlen));

        AlgorithmParameterGenerator gen = AlgorithmParameterGenerator.getInstance("DH");
        gen.init(bitlen);

        DHParameterSpec spec = (DHParameterSpec)gen.generateParameters().getParameterSpec(DHParameterSpec.class);
        System.out.println("P: " + String.valueOf(spec.getP()));
        System.out.println("G: " + String.valueOf(spec.getG()));
    }
}

コンパイルします。

javac CreateDiffieHellmanIv.java

実行します。

java CreateDiffieHellmanIv

生成されます。

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Generating DiffieHellman initialization vector... bitlen:1024
P: 145092357773036288785759831358363532457242150558361433565637207115514679411584100914869369530346476337051157705709858973344162440367967367833131503361926409583294585834757269998763188665426891871955393171079827134223234474237577100562967866893704671731464827466258191400928247383857555225260521584462646243757
G: 12076877650358872723433720596980214708516091408794486767543845481119286250958515342123571307476546309975921911735092979287081062213826767342459759424622360942234980320288127473825416480708591619721965721848952913500501787074997260325092958513471288533670082527450298168344704575797601113639175082590501897125

べんり。

JavaでDH鍵交換を実装する

やんごとなき事情でJavaでDH鍵交換を実装しなければならなくなったので実装してみました。
クラス/メソッドの説明と型しか書かれていないJavaのドキュメントをdisりつつ、いろいろ試行錯誤してみたらできた。
ググっても無駄に長くてめんどくさくて実用性に欠ける実装ばかり出てきたりして辛い思いをしたので公開してみます。
javaは最近はじめて書いたのでよくわかんないんだけど、Exceptionのcatchは公開用に適当にe.printStackTrace()してお茶を濁しております。こういうのどうするのがいいんすかね。
念のため書いておくと、DH鍵交換は単体だと中間者攻撃に対して脆弱なので、素直にSSLなどを使うのがおすすめでございます。