testrsa.java
来自「jpeg2000编解码」· Java 代码 · 共 303 行
JAVA
303 行
// $Id: TestRSA.java,v 1.1.1.1 2002/08/27 12:32:14 grosbois Exp $//// $Log: TestRSA.java,v $// Revision 1.1.1.1 2002/08/27 12:32:14 grosbois// Add cryptix 3.2//// Revision 1.13 2000/08/17 11:41:02 edwin// java.* -> xjava.*//// Revision 1.12 1999/07/26 16:12:48 iang// Now catches Throwable, as unknown class errors were sneaking through//// Revision 1.11 1999/07/12 20:37:38 edwin// renaming java.security.interfaces.RSAPrivateKey and RSAPublicKey to CryptixRSAPrivateKey and CryptixRSAPublicKey. This is one more step to JDK1.2 compatibility.//// Revision 1.10 1998/02/01 05:08:44 hopwood// + Committed changes below.//// Revision 1.9.1 1998/02/01 hopwood// + Checked for security, and made public.//// Revision 1.9 1998/01/28 05:40:01 hopwood// + Major update of test classes.//// Revision 1.8 1998/01/12 04:10:40 hopwood// + Made engineTest() protected.// + Cosmetics.//// Revision 1.7 1997/12/07 06:42:21 hopwood// + Added TestElGamal, various other changes.//// Revision 1.6 1997/11/29 05:12:22 hopwood// + Changes to use new test API (BaseTest).//// Revision 1.5 1997/11/22 07:05:41 raif// + Updated the dox.// + Replaced use of getU() with getInverseOfQModP().//// Revision 1.4 1997/11/20 22:31:26 hopwood// + cryptix.util.* name changes.//// Revision 1.3 1997/11/07 05:53:26 raif// *** empty log message ***//// Revision 1.2 1997/11/05 08:01:56 raif// *** empty log message ***//// Revision 1.1.1.1 1997/11/03 22:36:55 hopwood// + Imported to CVS (tagged as 'start').//// Revision 0.1.0.0 1997/07/23 R. Naffah// + original version.//// $Endlog$/* * Copyright (c) 1997 Systemics Ltd * on behalf of the Cryptix Development Team. All rights reserved. */package cryptix.test;import cryptix.util.core.BI;import cryptix.util.core.Hex;import cryptix.util.test.BaseTest;import java.math.BigInteger;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import java.security.Signature;import xjava.security.Cipher;import xjava.security.interfaces.CryptixRSAPublicKey;import xjava.security.interfaces.CryptixRSAPrivateKey;import xjava.security.interfaces.RSAFactors;/** * This object tests the RawRSA* and RSA_*_PKCS1 classes by generating * 4 keypairs with varying strength (384- to 768-bit in 128-bit increments). * It then tests each newly created keypair by signing a fixed string with * the private key and verifying the obtained signature with the public one. * <p> * <b>Copyright</b> © 1997 * <a href="http://www.systemics.com/">Systemics Ltd</a> on behalf of the * <a href="http://www.systemics.com/docs/cryptix/">Cryptix Development Team</a>. * <br>All rights reserved. * <p> * <b>$Revision: 1.1.1.1 $</b> * @since Cryptix 2.2.2 * @author Raif S. Naffah */public class TestRSAextends BaseTest{// Constants and variables//................................................................................ private static final byte[] message = ( "Je ne veux que du magnifique, et je ne travaille pas pour le " + "vulgaire des lecteurs --Giambattista BODONI (1740-1813)").getBytes(); private static final SecureRandom prng = new SecureRandom();// Test methods//................................................................................ public static void main (String[] args) { new TestRSA().commandline(args); } protected void engineTest() throws Exception { int k = 4; setExpectedPasses(k*9); KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); Signature[] sigs = new Signature[] { Signature.getInstance("MD2/RSA/PKCS#1"), Signature.getInstance("MD5/RSA/PKCS#1"), Signature.getInstance("SHA-1/RSA/PKCS#1"), Signature.getInstance("RIPEMD160/RSA/PKCS#1"), }; Cipher cipher = Cipher.getInstance("RSA"); int s; // key strength for (int i = 0; i < k; i++) { s = 384 + 128 * i; out.println("\nTest #" + (i + 1) + " (" + s + "-bit modulus)\n"); out.print(" Generating keypair "); kpg.initialize(s, prng); out.print(". "); KeyPair pair = kpg.generateKeyPair(); out.print(". "); PrivateKey sk = pair.getPrivate(); out.print(". "); PublicKey pk = pair.getPublic(); out.println(". Done!\n"); // out.print(" Testing Signatures "); for (int j = 0; j < sigs.length; j++) { testSignature(s, pk, sk, sigs[j]); // out.print(". "); } // out.println("Done!\n"); testEncryption(s, pk, sk, cipher); } } private void testSignature(int s, PublicKey pk, PrivateKey sk, Signature alg) { try { out.println(" Signing with a " + s + "-bit key using " + alg.getAlgorithm() + "..."); alg.initSign(sk); alg.update(message); byte[] signature = alg.sign(); out.println(" Verifying with same " + s + "-bit key using " + alg.getAlgorithm() + "..."); alg.initVerify(pk); alg.update(message); boolean ok = alg.verify(signature); passIf(ok, "Signature verification"); if (!ok) { out.println("---- begin debugging -----\n"); out.println("Computed signature: " + Hex.dumpString(signature)); out.println("RSA parameters:"); BigInteger m = ((CryptixRSAPublicKey) pk).getModulus(); BigInteger e = ((CryptixRSAPublicKey) pk).getExponent(); out.println(" Public key material:"); out.println(" n: " + BI.dumpString(m)); out.println(" e: " + BI.dumpString(e)); BigInteger n = ((CryptixRSAPrivateKey) sk).getModulus(); BigInteger d = ((CryptixRSAPrivateKey) sk).getExponent(); BigInteger p = ((RSAFactors) sk).getP(); BigInteger q = ((RSAFactors) sk).getQ(); BigInteger u = ((RSAFactors) sk).getInverseOfQModP(); out.println(" Private key material:"); out.println(" n: " + BI.dumpString(n)); out.println(" d: " + BI.dumpString(d)); out.println(" p: " + BI.dumpString(p)); out.println(" q: " + BI.dumpString(q)); out.println(" u: " + BI.dumpString(u)); BigInteger x = new BigInteger(signature); out.println(" The signature as a BigInteger:"); out.println(" x: " + BI.dumpString(x)); out.println("RSA correctness tests:"); try { // 1. same modulus for both public and private keys boolean yes = m.compareTo(n) == 0; out.println("\t1. Same modulus? " + yes); if (!yes) throw new RuntimeException(); // 2. n = pq yes = p.multiply(q).compareTo(n) == 0; out.println("\t2. n = pq? " + yes); if (!yes) throw new RuntimeException(); // 3. x = (x ** ed) mod n BigInteger y = x.modPow(e, n); BigInteger z = y.modPow(d, n); yes = z.compareTo(x) == 0; out.println("\t3. x = (x ** ed) mod n? " + yes); if (!yes) throw new RuntimeException(); // 4. same with CRT-based formula BigInteger ONE = BigInteger.valueOf(1L); BigInteger ep = d.mod(p.subtract(ONE)); BigInteger eq = d.mod(q.subtract(ONE)); BigInteger p2 = y.mod(p).modPow(ep, p); BigInteger q2 = y.mod(q).modPow(eq, q); q2 = q2.subtract(p2); if (q2.signum() == -1) q2 = q2.add(q); // 0 <= q2 - p2 < q z = p2.add(p.multiply(q2.multiply(u).mod(q))); yes = z.compareTo(x) == 0; out.println("\t4. (x ** e) mod n = (y ** d) mod pq? " + yes); if (!yes) throw new RuntimeException(); } catch (Throwable ex) { error(ex); } // passed RSA tests - must be a problem with formatting out.println("---- end debugging -----"); } // flip a bit. signature[0] ^= 1; alg.initVerify(pk); alg.update(message); ok = !alg.verify(signature); passIf(ok, "Incorrect signature should not verify"); } catch (Throwable e) { error(e); } } private void testEncryption(int s, PublicKey pk, PrivateKey sk, Cipher alg) { skip("Encryption test not implemented"); }/* old methods public void self_test() throws Exception { KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA", "Cryptix"); SecureRandom random = new SecureRandom(); long start = System.currentTimeMillis(); keygen.initialize(1024, random); KeyPair keypair = keygen.generateKeyPair(); long duration = System.currentTimeMillis() - start; out.println("Keygen: " + (float)duration/1000 + " seconds"); //RawRSACipher raw = new RawRSACipher(); //raw.test(keypair, random); } private void testEncryption(KeyPair keypair, SecureRandom random, Cipher cipher) throws KeyException { RSAPrivateKey privateKey = (RSAPrivateKey) (keypair.getPrivate()); RSAPublicKey publicKey = (RSAPublicKey) (keypair.getPublic()); byte[] M = new byte[blockSize()]; random.nextBytes(M); M[0] = 0; // make sure input is within range long start = System.currentTimeMillis(); cipher.initEncrypt(publicKey); BigInteger e = exp; byte[] C = crypt(M); long midpoint = System.currentTimeMillis(); cipher.initDecrypt(privateKey); byte[] Mdash = crypt(C); long end = System.currentTimeMillis(); out.println(" n = " + BI.dumpString(n)); out.println(" e = " + BI.dumpString(e)); out.println(" d = " + BI.dumpString(exp)); out.println(" p = " + BI.dumpString(p)); out.println(" q = " + BI.dumpString(q)); out.println("q^-1 mod p = " + BI.dumpString(u)); out.println(" plaintext = " + Hex.toString(M) + "\n"); out.println("ciphertext = " + Hex.toString(C) + "\n"); boolean ok = ArrayUtil.areEqual(M, Mdash); if (!ok) out.println(" computed = " + Hex.toString(Mdash) + "\n"); passIf(ok, "Computed matches original?"); out.println("Encrypt: " + ((float) (midpoint - start) / 1000) + " seconds"); out.println("Decrypt: " + ((float) (end - midpoint) / 1000) + " seconds"); }*/}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?