Java非对称加密KeyPairGenerator类
Java加密的常用的加密算法類型有三種
1單向加密:
也就是不可逆的加密,例如MD5,SHA,HMAC
2對稱加密:
也就是加密方和解密方利用同一個(gè)秘鑰對數(shù)據(jù)進(jìn)行加密和解密,例如DES,PBE等等
3非對稱加密:
非對稱加密分為公鑰和秘鑰,二者是非對稱的,例如用私鑰加密的內(nèi)容需要使用公鑰來解密,使用公鑰加密的內(nèi)容需要用私鑰來解密,DSA,RSA…
而keyGenerator,KeyPairGenerator,SecretKeyFactory的三種使用方法剛好和這三種加密算法類型對上
keyGenerator:
秘鑰生成器,也就是更具算法類型隨機(jī)生成一個(gè)秘鑰,例如HMAC,所以這個(gè)大部分用在非可逆的算法中。
SecretKeyFactory:
秘密秘鑰工廠,言外之意就是需要根據(jù)一個(gè)秘密(password)去生成一個(gè)秘鑰,例如DES,PBE,所以大部分使用在對稱加密中。
KeyPairGenerator:
秘鑰對生成器,也就是可以生成一對秘鑰,也就是公鑰和私鑰,所以大部分使用在非對稱加密中。
下面主要介紹一下KeyPairGenerator
KeyPairGenerator類
KeyPairGenerator 類用于生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠方法(返回一個(gè)給定類的實(shí)例的靜態(tài)方法)構(gòu)造的。
特定算法的密鑰對生成器可以創(chuàng)建能夠與此算法一起使用的公鑰/私鑰對。它還可以將特定于算法的參數(shù)與每個(gè)生成的密鑰關(guān)聯(lián)。
有兩種生成密鑰對的方式:與算法無關(guān)的方式和特定于算法的方式。兩種方式的唯一區(qū)別在于對象的初始化:
與算法無關(guān)的初始化
所有的密鑰對生成器遵循密鑰大小和隨機(jī)源的概念。對于不同的算法,密鑰大小的解釋也不相同(例如,對于 DSA 算法,密鑰大小對應(yīng)于模的長度)。此 KeyPairGenerator 類有一個(gè) initialize 方法,該方法帶有兩個(gè)通用的共享類型的參數(shù)。還有一個(gè)只帶有 keysize 參數(shù)的方法,它使用以最高優(yōu)先級安裝的提供者的 SecureRandom 實(shí)現(xiàn)作為隨機(jī)源。(如果任何安裝的提供者都不提供 SecureRandom 的實(shí)現(xiàn),則使用系統(tǒng)提供的隨機(jī)源。)
因?yàn)檎{(diào)用上述與算法無關(guān)的 initialize 方法時(shí)沒有指定其他參數(shù),所以由提供者決定如何處理與每個(gè)密鑰關(guān)聯(lián)的特定于算法的參數(shù)(如果有)。
如果算法為 DSA 算法,密鑰大小(模大小)為 512、768 或 1024,那么 Sun 提供者對 p、q 和 g 參數(shù)使用一組預(yù)計(jì)算值。如果模大小不是上述值之一,則 Sun 提供者創(chuàng)建一個(gè)新的參數(shù)集合。其他提供者可能具有供更多模大小(不僅僅是上文提及的那三個(gè))使用的預(yù)計(jì)算參數(shù)集合。其他提供者也可能沒有任何預(yù)計(jì)算參數(shù)列表,而總是創(chuàng)建新的參數(shù)集合。
特定于算法的初始化
對于特定于算法的參數(shù)集合已存在的情況(例如,DSA 中所謂的公用參數(shù)),有兩個(gè) initialize 方法具有 AlgorithmParameterSpec 參數(shù)。其中一個(gè)方法還有一個(gè) SecureRandom 參數(shù),而另一個(gè)方法使用以最高優(yōu)先級安裝的提供者的 SecureRandom 實(shí)現(xiàn)作為隨機(jī)源。(如果任何安裝的提供者都不提供 SecureRandom 的實(shí)現(xiàn),則使用系統(tǒng)提供的隨機(jī)源。)
每個(gè)提供者都必須提供(并記錄)默認(rèn)的初始化,以防客戶端沒有顯式初始化 KeyPairGenerator(通過調(diào)用 initialize 方法)。例如,Sun 提供者使用 1024 位的默認(rèn)模大小(密鑰大小)。
注意,由于歷史原因,此類是抽象類,是從 KeyPairGeneratorSpi 擴(kuò)展的。應(yīng)用程序開發(fā)人員只需注意在此 KeyPairGenerator 類中定義的方法;超類中的所有方法是供加密服務(wù)提供者使用的,這些加密服務(wù)提供者希望提供自己的密鑰對生成器實(shí)現(xiàn)。
Java提供的`KeyPairGenerator`類。 用于生成公鑰和私鑰對。 要使用`KeyPairGenerator`類生成密鑰,按照以下步驟操作。
第1步:創(chuàng)建KeyPairGenerator對象
KeyPairGenerator類提供getInstance()方法,該方法接受表示所需密鑰生成算法的String變量,并返回生成密鑰的KeyPairGenerator對象。
使用getInstance()方法創(chuàng)建KeyPairGenerator對象,如下所示。
//Creating KeyPair generator object KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");第2步:初始化KeyPairGenerator對象
KeyPairGenerator類提供了一個(gè)名為initialize()的方法,該方法用于初始化密鑰對生成器。 此方法接受表示密鑰大小的整數(shù)值。
使用此方法初始化在上一步中創(chuàng)建的KeyPairGenerator對象,如下所示。
//Creating KeyPair generator object KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA"); //Initializing the KeyPairGenerator keyPairGen.initialize(2048);第3步:生成KeyPairGenerator
可以使用KeyPairGenerator類的generateKeyPair()方法生成KeyPair。 使用此方法生成密鑰對,如下所示。
//Generate the pair of keys KeyPair pair = keyPairGen.generateKeyPair();第4步:獲取私鑰/公鑰
可以使用getPrivate()方法從生成的密鑰對對象中獲取私鑰,如下所示。
//Getting the private key from the key pair PrivateKey privKey = pair.getPrivate();可以使用getPublic()方法從生成的KeyPair對象獲取公鑰,如下所示。
//Getting the public key from the key pair PublicKey publicKey = pair.getPublic(); Java示例
下面的示例演示了使用javax.crypto包的KeyPairGenerator類生成密鑰的密鑰。
執(zhí)行上面示例代碼,得到下結(jié)果:
Keys generated獲取公鑰接口
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(512); KeyPair key = keyPairGen.generateKeyPair(); Base64.Encoder encoder = Base64.getEncoder(); Map.Entry<String, String> keyPair = new AbstractMap.SimpleEntry(encoder.encodeToString(key.getPublic().getEncoded()),encoder.encodeToString(key.getPrivate().getEncoded())); temporaryCodeDAO.cache(keyPair.getKey(), keyPair.getValue(), 100, TimeUnit.SECONDS);//緩存到Redis return ResponseResult.data(keyPair.getKey());總結(jié)
以上是生活随笔為你收集整理的Java非对称加密KeyPairGenerator类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs 安装后 npm-v 无效,
- 下一篇: 趣学python3(21)-pygame