天天看點

數字簽名算法:Rainbow

數字簽名算法:Rainbow

Java代碼

import base64.Base64;

import org.junit.BeforeClass;

import org.spongycastle.crypto.AsymmetricCipherKeyPair;

import org.spongycastle.crypto.params.AsymmetricKeyParameter;

import org.spongycastle.pqc.crypto.rainbow.*;

import java.security.SecureRandom;

public class RainbowTest {

    private static AsymmetricKeyParameter privateKey = null;

    private static AsymmetricKeyParameter publicKey = null;

    @BeforeClass

    public static void init() {

        RainbowKeyPairGenerator keyPairGenerator = new RainbowKeyPairGenerator();

        RainbowKeyGenerationParameters rbKGParams = new RainbowKeyGenerationParameters(new SecureRandom(), new RainbowParameters());

        keyPairGenerator.initialize(rbKGParams);

        AsymmetricCipherKeyPair keyPair = keyPairGenerator.genKeyPair();

        privateKey =  keyPair.getPrivate();

        RainbowPrivateKeyParameters privKey = (RainbowPrivateKeyParameters) privateKey;

        publicKey = keyPair.getPublic();

        RainbowPublicKeyParameters pubKey = (RainbowPublicKeyParameters) publicKey;

    }

    @org.junit.Test

    public void test() {

        String message = "13120983870";

        RainbowSigner rainbow = new RainbowSigner();

        rainbow.init(true, privateKey);

        byte[] signature = rainbow.generateSignature(message.getBytes());

        System.out.println("message=" + message + ";signature=base64:" + Base64.byteArrayToBase64(signature));

        rainbow.init(false, publicKey);

        boolean result = rainbow.verifySignature(message.getBytes(), signature);

        System.out.println(result);

        result = rainbow.verifySignature("13120983871".getBytes(), signature);

        System.out.println(result);

    }

}

運作結果代碼 

message=13120983870;signature=base64:SuIF/kR6Wuo6dxe/Uqi3he0ad9G/ezsAim/9OsytQUHV

true

false

Java 标準api方式:

1、java的KeyPairGenerator,PrivateKey,PublicKey接口

2、java的Provider,KeyFactory,Signature接口

生成公鑰和私鑰:BCRainbowPrivateKey,BCRainbowPublicKey,他們分别實作了java的PrivateKey,PublicKey接口,并且私鑰ASN.1編碼(規範),編碼按照PKCS#8标準,公鑰ASN.1編碼(規範),編碼按照X.509标準。見#getEncoded方法實作。

繼續閱讀