📄 dhtest.java
字号:
// KeyPair aKeyPair = keyGen.generateKeyPair(); KeyAgreement aKeyAgree = KeyAgreement.getInstance("DH", "BC"); checkKeySize(privateValueSize, aKeyPair); aKeyAgree.init(aKeyPair.getPrivate()); // // b side // KeyPair bKeyPair = keyGen.generateKeyPair(); KeyAgreement bKeyAgree = KeyAgreement.getInstance("DH", "BC"); checkKeySize(privateValueSize, bKeyPair); bKeyAgree.init(bKeyPair.getPrivate()); // // agreement // aKeyAgree.doPhase(bKeyPair.getPublic(), true); bKeyAgree.doPhase(aKeyPair.getPublic(), true); SecretKey k1 = aKeyAgree.generateSecret(PKCSObjectIdentifiers.id_alg_CMS3DESwrap.getId()); SecretKey k2 = aKeyAgree.generateSecret(PKCSObjectIdentifiers.id_alg_CMS3DESwrap.getId()); } private void checkKeySize(int privateValueSize, KeyPair aKeyPair) { if (privateValueSize != 0) { DHPrivateKey key = (DHPrivateKey)aKeyPair.getPrivate(); if (key.getX().bitLength() != privateValueSize) { fail("limited key check failed for key size " + privateValueSize); } } } private void testRandom( int size) throws Exception { AlgorithmParameterGenerator a = AlgorithmParameterGenerator.getInstance("DH", "BC"); a.init(size, new SecureRandom()); AlgorithmParameters params = a.generateParameters(); byte[] encodeParams = params.getEncoded(); AlgorithmParameters a2 = AlgorithmParameters.getInstance("DH", "BC"); a2.init(encodeParams); // a and a2 should be equivalent! byte[] encodeParams_2 = a2.getEncoded(); if (!areEqual(encodeParams, encodeParams_2)) { fail("encode/decode parameters failed"); } DHParameterSpec dhP = (DHParameterSpec)params.getParameterSpec(DHParameterSpec.class); testGP("DH", size, 0, dhP.getG(), dhP.getP()); } private void testECDH(String algorithm) throws Exception { KeyPairGenerator g = KeyPairGenerator.getInstance(algorithm, "BC"); EllipticCurve curve = new EllipticCurve( new ECFieldFp(new BigInteger("883423532389192164791648750360308885314476597252960362792450860609699839")), // q new BigInteger("7fffffffffffffffffffffff7fffffffffff8000000000007ffffffffffc", 16), // a new BigInteger("6b016c3bdcf18941d0d654921475ca71a9db2fb27d1d37796185c2942c0a", 16)); // b ECParameterSpec ecSpec = new ECParameterSpec( curve, ECPointUtil.decodePoint(curve, Hex.decode("020ffa963cdca8816ccc33b8642bedf905c3d358573d3f27fbbd3b3cb9aaaf")), // G new BigInteger("883423532389192164791648750360308884807550341691627752275345424702807307"), // n 1); // h g.initialize(ecSpec, new SecureRandom()); // // a side // KeyPair aKeyPair = g.generateKeyPair(); KeyAgreement aKeyAgree = KeyAgreement.getInstance(algorithm, "BC"); aKeyAgree.init(aKeyPair.getPrivate()); // // b side // KeyPair bKeyPair = g.generateKeyPair(); KeyAgreement bKeyAgree = KeyAgreement.getInstance(algorithm, "BC"); bKeyAgree.init(bKeyPair.getPrivate()); // // agreement // aKeyAgree.doPhase(bKeyPair.getPublic(), true); bKeyAgree.doPhase(aKeyPair.getPublic(), true); BigInteger k1 = new BigInteger(aKeyAgree.generateSecret()); BigInteger k2 = new BigInteger(bKeyAgree.generateSecret()); if (!k1.equals(k2)) { fail(algorithm + " 2-way test failed"); } // // public key encoding test // byte[] pubEnc = aKeyPair.getPublic().getEncoded(); KeyFactory keyFac = KeyFactory.getInstance(algorithm, "BC"); X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(pubEnc); ECPublicKey pubKey = (ECPublicKey)keyFac.generatePublic(pubX509); if (!pubKey.getW().equals(((ECPublicKey)aKeyPair.getPublic()).getW())) { System.out.println(" expected " + pubKey.getW().getAffineX() + " got " + ((ECPublicKey)aKeyPair.getPublic()).getW().getAffineX()); System.out.println(" expected " + pubKey.getW().getAffineY() + " got " + ((ECPublicKey)aKeyPair.getPublic()).getW().getAffineY()); fail(algorithm + " public key encoding (W test) failed"); } if (!pubKey.getParams().getGenerator().equals(((ECPublicKey)aKeyPair.getPublic()).getParams().getGenerator())) { fail(algorithm + " public key encoding (G test) failed"); } // // private key encoding test // byte[] privEnc = aKeyPair.getPrivate().getEncoded(); PKCS8EncodedKeySpec privPKCS8 = new PKCS8EncodedKeySpec(privEnc); ECPrivateKey privKey = (ECPrivateKey)keyFac.generatePrivate(privPKCS8); if (!privKey.getS().equals(((ECPrivateKey)aKeyPair.getPrivate()).getS())) { fail(algorithm + " private key encoding (S test) failed"); } if (!privKey.getParams().getGenerator().equals(((ECPrivateKey)aKeyPair.getPrivate()).getParams().getGenerator())) { fail(algorithm + " private key encoding (G test) failed"); } } private void testExceptions() { try { KeyAgreement aKeyAgree = KeyAgreement.getInstance("DH", "BC"); aKeyAgree.generateSecret("DES"); } catch (IllegalStateException e) { // okay } catch (Exception e) { fail("Unexpected exception: " + e, e); } } private void testDESAndDESede(BigInteger g, BigInteger p) throws Exception { DHParameterSpec dhParams = new DHParameterSpec(p, g, 256); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH", "BC"); keyGen.initialize(dhParams); KeyPair kp = keyGen.generateKeyPair(); KeyAgreement keyAgreement = KeyAgreement.getInstance("DH", "BC"); keyAgreement.init(kp.getPrivate()); keyAgreement.doPhase(kp.getPublic(), true); SecretKey key = keyAgreement.generateSecret("DES"); if (key.getEncoded().length != 8) { fail("DES length wrong"); } if (!DESKeySpec.isParityAdjusted(key.getEncoded(), 0)) { fail("DES parity wrong"); } key = keyAgreement.generateSecret("DESEDE"); if (key.getEncoded().length != 24) { fail("DESEDE length wrong"); } if (!DESedeKeySpec.isParityAdjusted(key.getEncoded(), 0)) { fail("DESEDE parity wrong"); } key = keyAgreement.generateSecret("Blowfish"); if (key.getEncoded().length != 56) { fail("Blowfish length wrong"); } } private void testInitialise() throws Exception { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH", "BC"); keyGen.initialize(512); keyGen.generateKeyPair(); testTwoParty("DH", 512, 0, keyGen); } public void performTest() throws Exception { testGP("DH", 512, 0, g512, p512); testGP("DiffieHellman", 768, 0, g768, p768); testGP("DIFFIEHELLMAN", 1024, 0, g1024, p1024); testGP("DH", 512, 64, g512, p512); testGP("DiffieHellman", 768, 128, g768, p768); testGP("DIFFIEHELLMAN", 1024, 256, g1024, p1024); testExplicitWrapping(512, 0, g512, p512); testRandom(256); testECDH("ECDH"); testECDH("ECDHC"); testExceptions(); testDESAndDESede(g768, p768); testInitialise(); } public static void main( String[] args) { Security.addProvider(new BouncyCastleProvider()); runTest(new DHTest()); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -