rsawithany.java

来自「一个非常好的ssh客户端实现」· Java 代码 · 共 176 行

JAVA
176
字号
/****************************************************************************** * * Copyright (c) 1999-2003 AppGate Network Security AB. All Rights Reserved. *  * This file contains Original Code and/or Modifications of Original Code as * defined in and that are subject to the MindTerm Public Source License, * Version 2.0, (the 'License'). You may not use this file except in compliance * with the License. *  * You should have received a copy of the MindTerm Public Source License * along with this software; see the file LICENSE.  If not, write to * AppGate Network Security AB, Otterhallegatan 2, SE-41118 Goteborg, SWEDEN * *****************************************************************************/package com.mindbright.security.publickey;import java.math.BigInteger;import com.mindbright.jca.security.InvalidKeyException;import com.mindbright.jca.security.SignatureException;public abstract class RSAWithAny extends BaseSignature {    // OID { 1.3.14.3.2.26 }    // iso(1) identified-org(3) OIW(14) secsig(3) alg(2) sha1(26)    private final static byte[] SHA1_ASN_ID = {        0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,	0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14    };    // OID { 1.3.36.3.2.1 }    // iso(1) identified-org(3) teletrust(36) alg(3) hashAlg(2) ripemd160(1)    private static final byte[] RIPEMD160_ASN_ID = {        0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2B, 0x24,	0x03, 0x02, 0x01, 0x05, 0x00, 0x04, 0x14    };    // OID { 1.2.840.113549.2.5 }    // iso(1) member-body(2) US(840) rsadsi(113549) digestAlg(2) md5(5)    private final static byte[] MD5_ASN_ID = {        0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, (byte)0x86,	0x48, (byte)0x86, (byte)0xf7, 0x0d, 0x02, 0x05, 0x05, 0x00,	0x04, 0x10    };    // OID { 1.2.840.113549.2.2 }    // iso(1) member-body(2) US(840) rsadsi(113549) digestAlg(2) md2(2)    private final static byte[] MD2_ASN_ID = {        0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, (byte)0x86,	0x48, (byte)0x86, (byte)0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00,	0x04, 0x10    };    private byte[] asnId;    protected RSAWithAny(String digAlg) {	super(digAlg);	//	// !!! TODO Handle this correctly with ASN1	//	if(digAlg.equals("SHA") || digAlg.equals("SHA1")) {	    asnId = SHA1_ASN_ID;	} else if(digAlg.equals("MD5")) {	    asnId = MD5_ASN_ID;	} else if(digAlg.equals("MD2")) {	    asnId = MD2_ASN_ID;	} else if(digAlg.equals("RIPEMD160")) {	    asnId = RIPEMD160_ASN_ID;	} else {	    throw new Error("Non supported digest algorithm: " + digAlg);	}    }    protected void initVerify() throws InvalidKeyException {	if(publicKey == null || !(publicKey instanceof RSAPublicKey)) {	    throw new InvalidKeyException("Wrong key for RSAWithAny verify: " +					  publicKey);	}    }    protected void initSign() throws InvalidKeyException {	if(privateKey == null || !(privateKey instanceof RSAPrivateKey)) {	    throw new InvalidKeyException("Wrong key for RSAWithAny sign: " +					  privateKey);	}    }    protected byte[] sign(byte[] data) throws SignatureException {	byte[] tmp = new byte[data.length + asnId.length];	System.arraycopy(asnId, 0, tmp, 0, asnId.length);	System.arraycopy(data, 0, tmp, asnId.length, data.length);	data = tmp;	BigInteger dataInt = new BigInteger(1, data);	int        mLen    =	    (((RSAPrivateKey)privateKey).getModulus().bitLength() + 7) / 8;	dataInt = RSAAlgorithm.addPKCS1Pad(dataInt, 1, mLen, getRandom());	BigInteger signatureInt = null;	if(privateKey instanceof RSAPrivateCrtKey) {	    RSAPrivateCrtKey key      = (RSAPrivateCrtKey)privateKey;	    BigInteger primeP         = key.getPrimeP();	    BigInteger primeQ         = key.getPrimeQ();	    BigInteger primeExponentP = key.getPrimeExponentP();	    BigInteger primeExponentQ = key.getPrimeExponentQ();	    BigInteger crtCoefficient = key.getCrtCoefficient();	    signatureInt = RSAAlgorithm.doPrivateCrt(dataInt,						     primeP, primeQ,						     primeExponentP,						     primeExponentQ,						     crtCoefficient);	} else {	    RSAPrivateKey key = (RSAPrivateKey)privateKey;	    BigInteger    privateExponent = key.getPrivateExponent();	    BigInteger    modulus         = key.getModulus();	    signatureInt = RSAAlgorithm.doPrivate(dataInt,						  modulus, privateExponent);	}	byte[] sig = unsignedBigIntToBytes(signatureInt, mLen);	return sig;    }    protected boolean verify(byte[] signature, byte[] data)	throws SignatureException    {	RSAPublicKey key            = (RSAPublicKey)publicKey;	BigInteger   publicExponent = key.getPublicExponent();	BigInteger   modulus        = key.getModulus();	BigInteger   signatureInt   = new BigInteger(1, signature);	signatureInt = RSAAlgorithm.doPublic(signatureInt,					     modulus, publicExponent);	signatureInt = RSAAlgorithm.stripPKCS1Pad(signatureInt, 1);	signature    = signatureInt.toByteArray();	if(data.length != (signature.length - asnId.length)) {	    return false;	}	byte[] cmp = asnId;	for(int i = 0, j = 0; i < signature.length; i++, j++) {	    if(i == asnId.length) {		cmp = data;		j   = 0;	    }	    if(signature[i] != cmp[j]) {		return false;	    }	}	return true;    }    private static byte[] unsignedBigIntToBytes(BigInteger bi, int size) {	byte[] tmp  = bi.toByteArray();	byte[] tmp2 = null;	if(tmp.length > size) {	    tmp2 = new byte[size];	    System.arraycopy(tmp, tmp.length - size, tmp2, 0, size);	} else if(tmp.length < size) {	    tmp2 = new byte[size];	    System.arraycopy(tmp, 0, tmp2, size - tmp.length, tmp.length);	} else {	    tmp2 = tmp;	}	return tmp2;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?