秘密鍵 / 公開鍵 を生成して署名

署名を生成するための秘密鍵、書名の確認を行うための公開鍵の生成。
アルゴリズムは "RSA" とか "DSA"とか。

public CryptKeyPair generate(String keyAlgorithm, int keyLength) {
    try {
        KeyPairGenerator generator = KeyPairGenerator.getInstance(keyAlgorithm);
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        if (seed != null ) { random.setSeed(seed); }
        generator.initialize(keyLength, random);
        KeyPair keyPair = generator.generateKeyPair();
…

RSA、DSAともにデフォルトだとキー長は最大で1024ビットみたい。
java.sun.comから制限解除ポリシーをDLしてくればもっと大きなキー長を指定可能。

署名の生成。

public byte[] sign(byte[] data) throws CryptException {
    try {
        keyConfig.load(); // 鍵のロード
        PrivateKey key = keyConfig.getKeyObject().getPrivateKey(); // 生成した秘密鍵
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        Signature signature = Signature.getInstance("SHA1with" + key.getAlgorithm());
        signature.initSign(key, random);
        signature.update(data);
        return signature.sign();
    } catch (Exception e) {
        throw new CryptException(Signer.class.getName() + ".sign", e);
    }
}

署名の確認。鍵、初期化メソッド以外署名の生成と同じ。

public boolean verify(byte[] data, byte[] signature) throws CryptException {
    try {
        keyConfig.load();
        PublicKey key = keyConfig.getKeyObject().getPublicKey();
        Signature signature = Signature.getInstance("SHA1with" + key.getAlgorithm());
        verifier.initVerify(key);
        verifier.update(data);
        return verifier.verify(signature);
    } catch (Exception e) {
        throw new CryptException(Verifier.class.getName() + ".verify", e);
    }
}

RSAで作った鍵は、共通鍵方式で 暗号化 / 復号化と同様に使うことも可能。ただしサポートされるアルゴリズムモードがECBのみの様子。試さなきゃ。