secretkey.java
来自「RSA加解密算法」· Java 代码 · 共 209 行
JAVA
209 行
/* * Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/) * All rights reserved. * * This library and applications are FREE FOR COMMERCIAL AND NON-COMMERCIAL USE * as long as the conditions within the COPYRIGHT file are adhered to. * */package cryptix.security.rsa;import cryptix.math.BigNum;import cryptix.math.BigInteger;/** * This class is an RSA secret key pair. * It can also be used as a public key. * * <p>Copyright (C) 1995, 1996 Systemics Ltd (http://www.systemics.com/) * All rights reserved. */public class SecretKey extends PublicKey{ /** the private exponent */ protected BigInteger d_; /** one of the factors of n */ protected BigInteger p_; /** the other factors of n */ protected BigInteger q_; /** the multiplic inverse of p mod q */ protected BigInteger u_; protected SecretKey() { super(); } /** * Creates a secret key pair from the component parts * @param n0 The public modulus * @param e0 The public exponent * @param d0 The private exponent * @param p0 One of the factors of n * @param q0 The other Factor of n * @param u0 The multiplic inverse of p mod q */ public SecretKey( BigInteger n0, BigInteger e0, BigInteger d0, BigInteger p0, BigInteger q0, BigInteger u0 ) { super( n0, e0 ); d_ = new BigInteger( d0 ); p_ = new BigInteger( p0 ); q_ = new BigInteger( q0 ); u_ = new BigInteger( u0 ); } /** * @return the private exponent d */ public final BigInteger d() { return new BigInteger( d_ ); } /** * @return the smallest factor of n */ public final BigInteger p() { return new BigInteger( p_ ); } /** * @return the largest factor of n */ public final BigInteger q() { return new BigInteger( q_ ); } /** * @return the multiplicative inverse of p mod q */ public final BigInteger u() { return new BigInteger( u_ ); } /** * decrypt a number * used for decryption or signing * @param encrypted the number to decrypt. * @return a decrypted number. */ public BigInteger decrypt( BigInteger encrypted ) { return cryptFast( d_, encrypted ); } /** * encrypt a number * used for encryption or signature verification. * <B>N.B.</B> this is quicker that the public key method, * since secret components are available. * @param plain the number to encrypt. * @return an encrypted number. */ public BigInteger encrypt( BigInteger plain ) { return cryptFast( e_, plain ); } /** * perform a fast encryption/decryption * @param key either e if encrypting or d if decrypting * @param msg the message to crypt. * @return the encrypted/decrypted message */ protected final BigInteger cryptFast( BigInteger key, BigInteger msg ) { BigInteger p1 = (BigInteger)p_.clone(); BigInteger q1 = (BigInteger)q_.clone(); p1.dec(); q1.dec(); BigInteger dmp1 = new BigInteger().mod( key, p1 ); BigInteger dmq1 = new BigInteger().mod( key, q1 ); // m1 = ((msg mod p) ^ dmq1) ) mod p BigInteger m = new BigInteger().mod( msg, p_ ).modExp( dmp1, p_ ); //r = ((msg mod q) ^ dmp1) ) mod q BigInteger r = new BigInteger().mod( msg, q_ ).modExp( dmq1, q_ ); BigInteger r1 = new BigInteger().sub( r, m ); BigInteger zero = BigInteger.zero(); if ( r1.cmp( zero ) < 0 ) r1.add( r1, q_ ); r.mul( r1, u_ ); r1.mod( r, q_ ); r.mul( r1, p_ ); r1.add( r, m ); return r1; } /** * perform a sanity check on the key * @return null if the key is O.K., otherwise an error message. */ public final String insane() { BigInteger t = new BigInteger().mul( p_, q_ ); if ( n_.cmp( t ) != 0 ) return "pq != n"; if ( p_.cmp( q_ ) >= 0 ) return " p >= q"; BigNum.modMul( t, p_, u_, q_ ); if ( t.cmp( BigInteger.one ) != 0 ) return "(p*u) mod q != 1"; return null; } /** * Perform a basic test on the key * @return null if the key is O.K., otherwise an error message. */ public final String test() { String ret = insane(); if ( ret != null ) return ret; StringBuffer sb = new StringBuffer(); byte tmp = 7,buf[] = new byte[16]; for ( int i = 0; i < 16; tmp += 3 ) buf[i++] = tmp; BigInteger msg = new BigInteger( buf );// System.out.println( "test string" + msg.toString() ); BigInteger encmsg = encrypt( msg ); BigInteger msg2 = decrypt( encmsg ); if ( msg.cmp( msg2 ) != 0 ) return "Key test failed " + msg + "\nis not" + msg2; return null; } /** * Access all parts of the secret key. * This function should be used with caution, * in order that the secret key is not compromised. * @return a string representation of the key. */ public String toString() { return super.toString() + "\nd:" + d_ + "\np:" + p_ + "\nq:" + q_ + "\nu:" + u_; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?