⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eccsign.java

📁 利用椭圆算法对数据进行签名认证的代码,需要下载bcprov-jdk16-137.jar进行支持.
💻 JAVA
字号:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.security.Security;

import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.signers.ECDSASigner;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECNamedCurveParameterSpec;
import org.bouncycastle.math.ec.ECPoint;

/*
 * Created on 2008-3-24
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

/**
 * @author HP
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class EccSign {

	public static void main(String[] args) {
		try{
		Security.addProvider(new BouncyCastleProvider());
		/*
		Enumeration enu=ECNamedCurveTable.getNames();
		while(enu.hasMoreElements())
		{
			String name=enu.nextElement().toString();
			System.out.println(name);
		}
		return;
		*/
		String plaint="this is my test";
		SHA1Digest  sha1=new SHA1Digest();
		sha1.update(plaint.getBytes(),0,plaint.getBytes().length);
		byte[] digest=new byte[sha1.getDigestSize()];
		sha1.doFinal(digest,0);
	
	//	ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime256v1");
		ECKeyPairGenerator gs=new ECKeyPairGenerator();
		ECNamedCurveParameterSpec para=ECNamedCurveTable.getParameterSpec("prime256v1");
		ECDomainParameters doman=new ECDomainParameters(para.getCurve(),para.getG(),para.getN(),para.getH());
		
		ECKeyGenerationParameters gpara=new ECKeyGenerationParameters(doman,new SecureRandom());
		//gpara.getRandom().getSeed()
		//KeyGenerationParameters kgen=new KeyGenerationParameters();
		gs.init(gpara);
		AsymmetricCipherKeyPair pair=gs.generateKeyPair();
	//	System.out.println("aaa");
		//KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
		//g.initialize(ecSpec,new SecureRandom());
	
		//KeyPair pair = g.generateKeyPair();
		//CipherParameters para=CipherParameters
		
		//ECPrivateKeyParameters privateparam=(ECPrivateKeyParameters)pair.getPrivate();
		
		ECPrivateKeyParameters privKey = (ECPrivateKeyParameters)pair.getPrivate();
		SaveKeys("private.dat",privKey.getD().toByteArray());
		
		System.out.println("save private key success");
		ECPublicKeyParameters pubKey = (ECPublicKeyParameters)pair.getPublic();
		SaveKeys("public.dat",pubKey.getQ().getEncoded());
		System.out.println("save public key success");
		ECDSASigner sign=new ECDSASigner();
		sign.init(true,pair.getPrivate());
		BigInteger[] values=sign.generateSignature(digest);
		System.out.println("signature ok");
		//ECPublicKeyParameters publicparam=(ECPublicKeyParameters)pair.getPublic();
		ECDSASigner vsign=new ECDSASigner();
		vsign.init(false,pair.getPublic());
		
		boolean flag= vsign.verifySignature(digest,values[0],values[1]);
		if(flag)
			System.out.println("verify ok");
		else
			System.out.println("verify err");
		
		System.out.println("the next step is to verify");
		ECNamedCurveParameterSpec paras=ECNamedCurveTable.getParameterSpec("prime256v1");
		ECDomainParameters domans=new ECDomainParameters(para.getCurve(),para.getG(),para.getN(),para.getH());
		//byte[] content=readFile("public.dat");
		byte[] content=readFile("H:\\vc\\EccSignAndVerify\\pub.dat");
		ECPoint point=domans.getCurve().decodePoint(content);
		ECPublicKeyParameters pubkeyss=new ECPublicKeyParameters(point,doman);
		ECDSASigner vsigns=new ECDSASigner();
		vsigns.init(false,pubkeyss);
		//digest[0]=0;
		boolean flags= vsigns.verifySignature(digest,values[0],values[1]);
		if(flags)
			System.out.println("verify oksssssssss");
		else
			System.out.println("verify errsssssssss");
		}
		catch(Exception es)
		{
			System.out.println(es.getMessage());
		}
	}
	public static void SaveKeys(String filename,byte[] content)
	{
		try{
			FileOutputStream fs=new FileOutputStream(filename);
			fs.write(content);
			fs.close();
		}
		catch(Exception es)
		{
			System.out.println(es.getMessage());
		}
	}
	public static byte[] readFile(String filename)
	{
		try
		{
			FileInputStream fin=new FileInputStream(filename);
			int filelen=fin.available();
			byte[] content=new byte[filelen];
			fin.read(content);
			fin.close();
			return content;
		}
		catch(Exception es)
		{
			System.out.println(es.getMessage());
			return null;
		}
	}
}

⌨️ 快捷键说明

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