-
公钥与私钥机制属于非对称
加密的范畴,非对称是相对于对称加密而言的,对称加密用于加密与解密的密钥是同一把,而非对称加密则用于加密与解密的密钥不相同,一个公开,称为公钥;一个保密,称为私钥,公钥与私钥必须成对出现,只有是配对的公钥与私钥才能用于加解密。公钥通过非安全通道发放,私钥则由发放者保留,公钥加密的数据,只能使用其配对的私钥对其解密;反之,私钥加密的数据,只可使用公钥对其解密。
对称加密出现后有效地提升的数据的安全性,但是由于加密与解密用的是同一把密钥,这样除了通信双方需要约定加密算法之外,数据发送方还需要将密钥发送给接收方,这为密钥的管理带来很大不便,为了弥补这一弱势,非对称加密算法就运而生。对于非对称加密来说,其公钥本身就是公开的,大家都知道,所以就不存在公钥管理的问题,只需要将私钥安全保存即可,这就为安全通信带来了极大的便利。
非对称加密算法与对象加密算法相比,密钥管理不复存在,在安全性上有着无法逾越的高度,但其加/解密效率却要比对称加密低得多,因此非对象加密算法往往应用在一些安全性要深圳市相当高的领域,如电子商务平台、银行网关、支付系统等。针对非对称加密算法低效的问题,很多情况下是将对称加密算法与非对称加密算法相结合,使用对称加密算法为数据加/解密,使用公钥与私钥为对象加密算法密钥加/解蜜。利用对称加密算法的高效性,加之非对象加密算法的密钥管理,提升整体加密系统的安全性。而且在算法的设计上,非对象加密算法对待加密数据长度还有着极为严苛的要求。例如,RSA算法要求待加密数据不得超过53个字节。基于上述原因,非对称加密算法主要用于交换对称加密算法与秘密密钥,而非数据交换。
下面是一个Java中使用公钥与私钥的例子:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172packagecom.xtayfjpk.security;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.security.Key;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjavax.crypto.Cipher;importorg.junit.Test;publicclassKeyPairTest {privatestaticfinalString ALGOGRITHM ="RSA";privatestaticfinalString PUBLIC_KEY_PATH ="public.key";privatestaticfinalString PRIVATE_KEY_PATH ="private.key";@TestpublicvoidtestGenerate()throwsException {//KeyPairGenerator引擎类用于产生密钥对,JDK(7)默认支持的算法有,DiffieHellman、DSA、RSA、ECKeyPairGenerator generator = KeyPairGenerator.getInstance(ALGOGRITHM);//产生密钥对KeyPair keyPair = generator.generateKeyPair();//获取公钥PublicKey publicKey = keyPair.getPublic();//获取私钥PrivateKey privateKey = keyPair.getPrivate();//将公钥与私钥写入文件,以备后用writeKey(PUBLIC_KEY_PATH, publicKey);writeKey(PRIVATE_KEY_PATH, privateKey);}@TestpublicvoidtestEncryptAndDecrypt()throwsException {Cipher cipher = Cipher.getInstance(ALGOGRITHM);//读取私钥,进行加密PrivateKey privateKey = (PrivateKey) readKey(PRIVATE_KEY_PATH);cipher.init(Cipher.ENCRYPT_MODE, privateKey);//加密String sendInfo ="我的明文";byte[] results = cipher.doFinal(sendInfo.getBytes());//读取公钥,进行解密PublicKey publicKey = (PublicKey) readKey(PUBLIC_KEY_PATH);cipher.init(Cipher.DECRYPT_MODE, publicKey);//解密byte[] deciphered = cipher.doFinal(results);//得到明文String recvInfo =newString(deciphered);System.out.println(recvInfo);}publicvoidwriteKey(String path, Key key)throwsException {FileOutputStream fos =newFileOutputStream(path);ObjectOutputStream oos =newObjectOutputStream(fos);oos.writeObject(key);oos.close();}publicKey readKey(String path)throwsException {FileInputStream fis =newFileInputStream(path);ObjectInputStream bis =newObjectInputStream(fis);Object object = bis.readObject();bis.close();return(Key) object;}}
在上面的例子中,保存公钥与私钥是直接通过对象序列化机制完成的,与秘密密钥一样,也可以获取编码后的二进制数据(Key.getEncoded())保存
2.Java安全之公钥与私钥-非对称加密
最新推荐文章于 2024-10-24 00:05:59 发布
2万+

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



