ECC
ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生。
当我开始整理《Java加密技术(二)》的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官方还是非官方的解释,最终只有一种答案——ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析。
如果想要获得ECC算法实现,需要调用硬件完成加密/解密(ECC算法相当耗费资源,如果单纯使用CPU进行加密/解密,效率低下),涉及到Java Card领域,PKCS#11。
其实,PKCS#11配置很简单,但缺乏硬件设备,无法尝试!
尽管如此,我照旧提供相应的Java实现代码,以供大家参考。
通过java代码实现如下: Coder类见Java加密技术(一)
请注意上述代码中的 TODO内容,再次提醒注意, Chipher不支持EC算法,以上代码仅供参考。 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey均不支持EC算法。为了确保程序能够正常执行,我们使用了NullCipher类,验证程序。
照旧提供一个测试类:
控制台输出:
当我开始整理《Java加密技术(二)》的时候,我就已经在开始研究ECC了,但是关于Java实现ECC算法的资料实在是太少了,无论是国内还是国外的资料,无论是官方还是非官方的解释,最终只有一种答案——ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析。
如果想要获得ECC算法实现,需要调用硬件完成加密/解密(ECC算法相当耗费资源,如果单纯使用CPU进行加密/解密,效率低下),涉及到Java Card领域,PKCS#11。
其实,PKCS#11配置很简单,但缺乏硬件设备,无法尝试!
尽管如此,我照旧提供相应的Java实现代码,以供大家参考。
通过java代码实现如下: Coder类见Java加密技术(一)
- importjava.math.BigInteger;
- importjava.security.Key;
- importjava.security.KeyFactory;
- importjava.security.interfaces.ECPrivateKey;
- importjava.security.interfaces.ECPublicKey;
- importjava.security.spec.ECFieldF2m;
- importjava.security.spec.ECParameterSpec;
- importjava.security.spec.ECPoint;
- importjava.security.spec.ECPrivateKeySpec;
- importjava.security.spec.ECPublicKeySpec;
- importjava.security.spec.EllipticCurve;
- importjava.security.spec.PKCS8EncodedKeySpec;
- importjava.security.spec.X509EncodedKeySpec;
- importjava.util.HashMap;
- importjava.util.Map;
- importjavax.crypto.Cipher;
- importjavax.crypto.NullCipher;
- importsun.security.ec.ECKeyFactory;
- importsun.security.ec.ECPrivateKeyImpl;
- importsun.security.ec.ECPublicKeyImpl;
- /**
- *ECC安全编码组件
- *
- *@author梁栋
- *@version1.0
- *@since1.0
- */
- publicabstractclassECCCoderextendsCoder{
- publicstaticfinalStringALGORITHM="EC";
- privatestaticfinalStringPUBLIC_KEY="ECCPublicKey";
- privatestaticfinalStringPRIVATE_KEY="ECCPrivateKey";
- /**
- *解密<br>
- *用私钥解密
- *
- *@paramdata
- *@paramkey
- *@return
- *@throwsException
- */
- publicstaticbyte[]decrypt(byte[]data,Stringkey)throwsException{
- //对密钥解密
- byte[]keyBytes=decryptBASE64(key);
- //取得私钥
- PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(keyBytes);
- KeyFactorykeyFactory=ECKeyFactory.INSTANCE;
- ECPrivateKeypriKey=(ECPrivateKey)keyFactory
- .generatePrivate(pkcs8KeySpec);
- ECPrivateKeySpececPrivateKeySpec=newECPrivateKeySpec(priKey.getS(),
- priKey.getParams());
- //对数据解密
- //TODOChipher不支持EC算法未能实现
- Ciphercipher=newNullCipher();
- //Cipher.getInstance(ALGORITHM,keyFactory.getProvider());
- cipher.init(Cipher.DECRYPT_MODE,priKey,ecPrivateKeySpec.getParams());
- returncipher.doFinal(data);
- }
- /**
- *加密<br>
- *用公钥加密
- *
- *@paramdata
- *@paramprivateKey
- *@return
- *@throwsException
- */
- publicstaticbyte[]encrypt(byte[]data,StringprivateKey)
- throwsException{
- //对公钥解密
- byte[]keyBytes=decryptBASE64(privateKey);
- //取得公钥
- X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(keyBytes);
- KeyFactorykeyFactory=ECKeyFactory.INSTANCE;
- ECPublicKeypubKey=(ECPublicKey)keyFactory
- .generatePublic(x509KeySpec);
- ECPublicKeySpececPublicKeySpec=newECPublicKeySpec(pubKey.getW(),
- pubKey.getParams());
- //对数据加密
- //TODOChipher不支持EC算法未能实现
- Ciphercipher=newNullCipher();
- //Cipher.getInstance(ALGORITHM,keyFactory.getProvider());
- cipher.init(Cipher.ENCRYPT_MODE,pubKey,ecPublicKeySpec.getParams());
- returncipher.doFinal(data);
- }
- /**
- *取得私钥
- *
- *@paramkeyMap
- *@return
- *@throwsException
- */
- publicstaticStringgetPrivateKey(Map<String,Object>keyMap)
- throwsException{
- Keykey=(Key)keyMap.get(PRIVATE_KEY);
- returnencryptBASE64(key.getEncoded());
- }
- /**
- *取得公钥
- *
- *@paramkeyMap
- *@return
- *@throwsException
- */
- publicstaticStringgetPublicKey(Map<String,Object>keyMap)
- throwsException{
- Keykey=(Key)keyMap.get(PUBLIC_KEY);
- returnencryptBASE64(key.getEncoded());
- }
- /**
- *初始化密钥
- *
- *@return
- *@throwsException
- */
- publicstaticMap<String,Object>initKey()throwsException{
- BigIntegerx1=newBigInteger(
- "2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8",16);
- BigIntegerx2=newBigInteger(
- "289070fb05d38ff58321f2e800536d538ccdaa3d9",16);
- ECPointg=newECPoint(x1,x2);
- //theorderofgenerator
- BigIntegern=newBigInteger(
- "5846006549323611672814741753598448348329118574063",10);
- //thecofactor
- inth=2;
- intm=163;
- int[]ks={7,6,3};
- ECFieldF2mecField=newECFieldF2m(m,ks);
- //y^2+xy=x^3+x^2+1
- BigIntegera=newBigInteger("1",2);
- BigIntegerb=newBigInteger("1",2);
- EllipticCurveellipticCurve=newEllipticCurve(ecField,a,b);
- ECParameterSpececParameterSpec=newECParameterSpec(ellipticCurve,g,
- n,h);
- //公钥
- ECPublicKeypublicKey=newECPublicKeyImpl(g,ecParameterSpec);
- BigIntegers=newBigInteger(
- "1234006549323611672814741753598448348329118574063",10);
- //私钥
- ECPrivateKeyprivateKey=newECPrivateKeyImpl(s,ecParameterSpec);
- Map<String,Object>keyMap=newHashMap<String,Object>(2);
- keyMap.put(PUBLIC_KEY,publicKey);
- keyMap.put(PRIVATE_KEY,privateKey);
- returnkeyMap;
- }
- }
请注意上述代码中的 TODO内容,再次提醒注意, Chipher不支持EC算法,以上代码仅供参考。 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey均不支持EC算法。为了确保程序能够正常执行,我们使用了NullCipher类,验证程序。
照旧提供一个测试类:
- importstaticorg.junit.Assert.*;
- importjava.math.BigInteger;
- importjava.security.spec.ECFieldF2m;
- importjava.security.spec.ECParameterSpec;
- importjava.security.spec.ECPoint;
- importjava.security.spec.ECPrivateKeySpec;
- importjava.security.spec.ECPublicKeySpec;
- importjava.security.spec.EllipticCurve;
- importjava.util.Map;
- importorg.junit.Test;
- /**
- *
- *@author梁栋
- *@version1.0
- *@since1.0
- */
- publicclassECCCoderTest{
- @Test
- publicvoidtest()throwsException{
- StringinputStr="abc";
- byte[]data=inputStr.getBytes();
- Map<String,Object>keyMap=ECCCoder.initKey();
- StringpublicKey=ECCCoder.getPublicKey(keyMap);
- StringprivateKey=ECCCoder.getPrivateKey(keyMap);
- System.err.println("公钥:\n"+publicKey);
- System.err.println("私钥:\n"+privateKey);
- byte[]encodedData=ECCCoder.encrypt(data,publicKey);
- byte[]decodedData=ECCCoder.decrypt(encodedData,privateKey);
- StringoutputStr=newString(decodedData);
- System.err.println("加密前:"+inputStr+"\n\r"+"解密后:"+outputStr);
- assertEquals(inputStr,outputStr);
- }
- }
控制台输出:
- 公钥:
- MEAwEAYHKoZIzj0CAQYFK4EEAAEDLAAEAv4TwFN7vBGsqgfXk95ObV5clO7oAokHD7BdOP9YMh8u
- gAU21TjM2qPZ
- 私钥:
- MDICAQAwEAYHKoZIzj0CAQYFK4EEAAEEGzAZAgEBBBTYJsR3BN7TFw7JHcAHFkwNmfil7w==
- 加密前:abc
- 解密后:abc
本文介绍如何在Java中实现椭圆曲线密码编码学(ECC),包括密钥生成、公钥加密及私钥解密等核心过程,并提供了一段示例代码。值得注意的是,Java标准库直接支持ECC算法有限,需借助特定实现。


被折叠的 条评论
为什么被折叠?



