知识大全 谈谈Java加密技术(六)
Posted 知
篇首语:要让事情改变,行改变我自己,要让事情变得更好,先让自己变得更好。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈谈Java加密技术(六)相关的知识,希望对你有一定的参考价值。
谈谈Java加密技术(六) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
接下来我们介绍DSA数字签名 非对称加密的另一种实现
DSA
DSA Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种 被美国NIST作为DSS(DigitalSignature Standard) 简单的说 这是一种更高级的验证方式 用作数字签名 不单单只有公钥 私钥 还有数字签名 私钥加密生成数字签名 公钥验证数据及签名 如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改 数字签名 是单向加密的升级!
通过java代码实现如下
import java security Key;import java security KeyFactory;import java security KeyPair;import java security KeyPairGenerator;import java security PrivateKey;import java security PublicKey;import java security SecureRandom;import java security Signature;import java security interfaces DSAPrivateKey;import java security interfaces DSAPublicKey;import java security spec PKCS EncodedKeySpec;import java security spec X EncodedKeySpec;import java util HashMap;import java util Map;
/** * DSA安全编码组件 * * @author 梁栋 * @version * @since */public abstract class DSACoder extends Coder
public static final String ALGORITHM = DSA ;
/** * 默认密钥字节数 * * <pre> * DSA * Default Keysize * Keysize must be a multiple of ranging from to (inclusive) * </pre> */ private static final int KEY_SIZE = ;
/** * 默认种子 */ private static final String DEFAULT_SEED = f a bbddd d a e ;
private static final String PUBLIC_KEY = DSAPublicKey ; private static final String PRIVATE_KEY = DSAPrivateKey ;
/** * 用私钥对信息生成数字签名 * * @param data * 加密数据 * @param privateKey * 私钥 * * @return * @throws Exception */ public static String sign(byte[] data String privateKey) throws Exception // 解密由base 编码的私钥 byte[] keyBytes = decryptBASE (privateKey);
// 构造PKCS EncodedKeySpec对象 PKCS EncodedKeySpec pkcs KeySpec = new PKCS EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory getInstance(ALGORITHM);
// 取私钥匙对象 PrivateKey priKey = keyFactory generatePrivate(pkcs KeySpec);
// 用私钥对信息生成数字签名 Signature signature = Signature getInstance(keyFactory getAlgorithm()); signature initSign(priKey); signature update(data);
return encryptBASE (signature sign());
/** * 校验数字签名 * * @param data * 加密数据 * @param publicKey * 公钥 * @param sign * 数字签名 * * @return 校验成功返回true 失败返回false * @throws Exception * */ public static boolean verify(byte[] data String publicKey String sign) throws Exception
// 解密由base 编码的公钥 byte[] keyBytes = decryptBASE (publicKey);
// 构造X EncodedKeySpec对象 X EncodedKeySpec keySpec = new X EncodedKeySpec(keyBytes);
// ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory getInstance(ALGORITHM);
// 取公钥匙对象 PublicKey pubKey = keyFactory generatePublic(keySpec);
Signature signature = Signature getInstance(keyFactory getAlgorithm()); signature initVerify(pubKey); signature update(data);
// 验证签名是否正常 return signature verify(decryptBASE (sign));
/** * 生成密钥 * * @param seed * 种子 * @return 密钥对象 * @throws Exception */ public static Map<String Object> initKey(String seed) throws Exception KeyPairGenerator keygen = KeyPairGenerator getInstance(ALGORITHM); // 初始化随机产生器 SecureRandom secureRandom = new SecureRandom(); secureRandom setSeed(seed getBytes()); keygen initialize(KEY_SIZE secureRandom);
KeyPair keys = keygen genKeyPair();
DSAPublicKey publicKey = (DSAPublicKey) keys getPublic(); DSAPrivateKey privateKey = (DSAPrivateKey) keys getPrivate();
Map<String Object> map = new HashMap<String Object>( ); map put(PUBLIC_KEY publicKey); map put(PRIVATE_KEY privateKey);
return map;
/** * 默认生成密钥 * * @return 密钥对象 * @throws Exception */ public static Map<String Object> initKey() throws Exception return initKey(DEFAULT_SEED);
/** * 取得私钥 * * @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());
再给出一个测试类import static junit Assert *;
import java util Map;
import junit Test;
/** * * @author 梁栋 * @version * @since */public class DSACoderTest
@Test public void test() throws Exception String inputStr = abc ; byte[] data = inputStr getBytes();
// 构建密钥 Map<String Object> keyMap = DSACoder initKey();
// 获得密钥 String publicKey = DSACoder getPublicKey(keyMap); String privateKey = DSACoder getPrivateKey(keyMap);
System err println( 公钥:\\r + publicKey); System err println( 私钥:\\r + privateKey);
// 产生签名 String sign = DSACoder sign(data privateKey); System err println( 签名:\\r + sign);
// 验证签名 boolean status = DSACoder verify(data publicKey sign); System err println( 状态:\\r + status); assertTrue(status);
控制台输出
公钥:MIIBtzCCASwGByqGSM BAEwggEfAoGBAP /U EddRIpUt KnC s Of EbdSPO EAMMeP C USZpRV AIlH WT NWPq/xfW MPbLm Vs E gB b/JmYLdrmVClpJ+f AR ECLCT up / xhv O fnxqimFQ E+ P UewwI VBNaFpEy nXzrith yrv iIDGZ RSAHHAhUAl BQjxUjC yykrmCouuEC/BYHPUCgYEA +GghdabPd LvKtcNrhXuXmUr v OuqC+VdMCz HgmdRWVeOutRZT+ZxBxCBgLRJFnEj EwoFhO zwkyjMim TwWeotUfI o KOuHiuzpnWRbqN/C/ohNWLx+ J ASQ zKTxvqhRkImog /hWuWfBpKLZl Ae UlZAFMO/ PSSoDgYQAAoGAIu RUlcQLp PI MrbssOY+ uySVnp TULSv T VaHoKzsLHgGTrwOvsGA+V yCNl WDu D bSLF ligOj+SMOEaPk VyRTlLXZWGPsf Mfd XAbMeVyKDSHHVGbMjBScajf bXooYQMlyoHiOt/WrCo+mv efstMM PGo=
私钥:MIIBTAIBADCCASwGByqGSM BAEwggEfAoGBAP /U EddRIpUt KnC s Of EbdSPO EAMMeP C USZpRV AIlH WT NWPq/xfW MPbLm Vs E gB b/JmYLdrmVClpJ+f AR ECLCT up / xhv O fnxqimFQ E+ P UewwI VBNaFpEy nXzrith yrv iIDGZ RSAHHAhUAl BQjxUjC yykrmCouuEC/BYHPUCgYEA +GghdabPd LvKtcNrhXuXmUr v OuqC+VdMCz HgmdRWVeOutRZT+ZxBxCBgLRJFnEj EwoFhO zwkyjMim TwWeotUfI o KOuHiuzpnWRbqN/C/ohNWLx+ J ASQ zKTxvqhRkImog /hWuWfBpKLZl Ae UlZAFMO/ PSSoEFwIVAIegLUtmm oQKQJTOiLugHTSjl/q
签名:MC CFQCMg J/uZmF GuRpr TNq w nDwIUJCyYNah+HtbU NcQfy Ac LeLQs=
状态:true
cha138/Article/program/Java/gj/201311/27470相关参考
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)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在各种应用系