知识大全 谈谈Java加密技术(七)
Posted 知
篇首语:年轻只知学习营利,乃生命中最黯淡之时刻。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈谈Java加密技术(七)相关的知识,希望对你有一定的参考价值。
谈谈Java加密技术(七) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
ECC
ECC Elliptic Curves Cryptography 椭圆曲线密码编码学 是目前已知的公钥体制中 对每比特所提供加密强度最高的一种体制 在软件注册保护方面起到很大的作用 一般的序列号通常由该算法产生
当我开始整理《Java加密技术(二)》的时候 我就已经在开始研究ECC了 但是关于Java实现ECC算法的资料实在是太少了 无论是国内还是国外的资料 无论是官方还是非官方的解释 最终只有一种答案——ECC算法在jdk 后加入支持 目前仅仅只能完成密钥的生成与解析
尽管如此 我照旧提供相应的Java实现代码 以供大家参考
通过java代码实现如下
import java math BigInteger;import java security Key;import java security KeyFactory;import java security interfaces ECPrivateKey;import java security interfaces ECPublicKey;import java security spec ECFieldF m;import java security spec ECParameterSpec;import java security spec ECPoint;import java security spec ECPrivateKeySpec;import java security spec ECPublicKeySpec;import java security spec EllipticCurve;import java security spec PKCS EncodedKeySpec;import java security spec X EncodedKeySpec;import java util HashMap;import java util Map;
import javax crypto Cipher;import javax crypto NullCipher;
import sun security ec ECKeyFactory;import sun security ec ECPrivateKeyImpl;import sun security ec ECPublicKeyImpl;
/** * ECC安全编码组件 * * @author 梁栋 * @version * @since */public abstract class ECCCoder extends Coder
public static final String ALGORITHM = EC ; private static final String PUBLIC_KEY = ECCPublicKey ; private static final String PRIVATE_KEY = ECCPrivateKey ;
/** * 解密<br> * 用私钥解密 * * @param data * @param key * @return * @throws Exception */ public static byte[] decrypt(byte[] data String key) throws Exception // 对密钥解密 byte[] keyBytes = decryptBASE (key);
// 取得私钥 PKCS EncodedKeySpec pkcs KeySpec = new PKCS EncodedKeySpec(keyBytes); KeyFactory keyFactory = ECKeyFactory INSTANCE;
ECPrivateKey priKey = (ECPrivateKey) keyFactory generatePrivate(pkcs KeySpec);
ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(priKey getS() priKey getParams());
// 对数据解密 // TODO Chipher不支持EC算法 未能实现 Cipher cipher = new NullCipher(); // Cipher getInstance(ALGORITHM keyFactory getProvider()); cipher init(Cipher DECRYPT_MODE priKey ecPrivateKeySpec getParams());
return cipher doFinal(data);
/** * 加密<br> * 用公钥加密 * * @param data * @param privateKey * @return * @throws Exception */ public static byte[] encrypt(byte[] data String privateKey) throws Exception // 对公钥解密 byte[] keyBytes = decryptBASE (privateKey);
// 取得公钥 X EncodedKeySpec x KeySpec = new X EncodedKeySpec(keyBytes); KeyFactory keyFactory = ECKeyFactory INSTANCE;
ECPublicKey pubKey = (ECPublicKey) keyFactory generatePublic(x KeySpec);
ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(pubKey getW() pubKey getParams());
// 对数据加密 // TODO Chipher不支持EC算法 未能实现 Cipher cipher = new NullCipher(); // Cipher getInstance(ALGORITHM keyFactory getProvider()); cipher init(Cipher ENCRYPT_MODE pubKey ecPublicKeySpec getParams());
return cipher doFinal(data);
/** * 取得私钥 * * @param keyMap * @return * @throws Exception */ public static String getPrivateKey(Map<String Object> keyMap) throws Exception Key key = (Key) keyMap get(PRIVATE_KEY);
return encryptBASE (key getEncoded());
/** * 取得公钥 * * @param keyMap * @return * @throws Exception */ public static String getPublicKey(Map<String Object> keyMap) throws Exception Key key = (Key) keyMap get(PUBLIC_KEY);
return encryptBASE (key getEncoded());
/** * 初始化密钥 * * @return * @throws Exception */ public static Map<String Object> initKey() throws Exception BigInteger x = new BigInteger( fe c bbc acaa d de e d e c eee ); BigInteger x = new BigInteger( fb d ff f e d ccdaa d );
ECPoint g = new ECPoint(x x );
// the order of generator BigInteger n = new BigInteger( ); // the cofactor int h = ; int m = ; int[] ks = ; ECFieldF m ecField = new ECFieldF m(m ks); // y^ +xy=x^ +x^ + BigInteger a = new BigInteger( ); BigInteger b = new BigInteger( );
EllipticCurve ellipticCurve = new EllipticCurve(ecField a b);
ECParameterSpec ecParameterSpec = new ECParameterSpec(ellipticCurve g n h); // 公钥 ECPublicKey publicKey = new ECPublicKeyImpl(g ecParameterSpec);
BigInteger s = new BigInteger( ); // 私钥 ECPrivateKey privateKey = new ECPrivateKeyImpl(s ecParameterSpec);
Map<String Object> keyMap = new HashMap<String Object>( );
keyMap put(PUBLIC_KEY publicKey); keyMap put(PRIVATE_KEY privateKey);
return keyMap;
请注意上述代码中的TODO内容 再次提醒注意 Chipher不支持EC算法 以上代码仅供参考 Chipher Signature KeyPairGenerator KeyAgreement SecretKey均不支持EC算法 为了确保程序能够正常执行 我们使用了NullCipher类 验证程序
照旧提供一个测试类
import static junit Assert *;
import java math BigInteger;import java security spec ECFieldF m;import java security spec ECParameterSpec;import java security spec ECPoint;import java security spec ECPrivateKeySpec;import java security spec ECPublicKeySpec;import java security spec EllipticCurve;import java util Map;
import junit Test;
/** * * @author 梁栋 * @version * @since */public class ECCCoderTest
@Test public void test() throws Exception String inputStr = abc ; byte[] data = inputStr getBytes();
Map<String Object> keyMap = ECCCoder initKey();
String publicKey = ECCCoder getPublicKey(keyMap); String privateKey = 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);
String outputStr = new String(decodedData); System err println( 加密前: + inputStr + \\n\\r + 解密后: + outputStr); assertEquals(inputStr outputStr);
控制台输出公钥:MEAwEAYHKoZIzj CAQYFK EEAAEDLAAEAv TwFN vBGsqgfXk ObV clO oAokHD BdOP YMh ugAU TjM qPZ
私钥 MDICAQAwEAYHKoZIzj CAQYFK EEAAEEGzAZAgEBBBTYJsR BN TFw JHcAHFkwNmfil w==
加密前: abc
解密后: abc
cha138/Article/program/Java/gj/201311/27542相关参考
Java加密技术(九) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在Java加密技术(八)中
漫谈Java加密技术(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 接下来我们介绍对称加密
漫谈Java加密技术(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 加密解密曾经是我一个毕
知识大全 Java技术进阶 基于Java的IDEA加密算法探讨
Java技术进阶基于Java的IDEA加密算法探讨 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
漫谈Java加密技术系列文章一至十 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 漫谈Java加
深入讨论JAVA字节码加密技术(2) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 这个累加载器
深入讨论JAVA字节码加密技术(1) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如果把的cl
论Java加密技术与Windows的结合 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 论Jav
Java文件加密-spring属性文件加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! pac
java中使用MD5加密算法进行加密 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在各种应用系