Java非对称加密KeyPairGenerator类
Java加密的常用的加密算法類型有三種
1單向加密:
也就是不可逆的加密,例如MD5,SHA,HMAC
2對稱加密:
也就是加密方和解密方利用同一個秘鑰對數據進行加密和解密,例如DES,PBE等等
3非對稱加密:
非對稱加密分為公鑰和秘鑰,二者是非對稱的,例如用私鑰加密的內容需要使用公鑰來解密,使用公鑰加密的內容需要用私鑰來解密,DSA,RSA…
而keyGenerator,KeyPairGenerator,SecretKeyFactory的三種使用方法剛好和這三種加密算法類型對上
keyGenerator:
秘鑰生成器,也就是更具算法類型隨機生成一個秘鑰,例如HMAC,所以這個大部分用在非可逆的算法中。
SecretKeyFactory:
秘密秘鑰工廠,言外之意就是需要根據一個秘密(password)去生成一個秘鑰,例如DES,PBE,所以大部分使用在對稱加密中。
KeyPairGenerator:
秘鑰對生成器,也就是可以生成一對秘鑰,也就是公鑰和私鑰,所以大部分使用在非對稱加密中。
下面主要介紹一下KeyPairGenerator
KeyPairGenerator類
KeyPairGenerator 類用于生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠方法(返回一個給定類的實例的靜態方法)構造的。
特定算法的密鑰對生成器可以創建能夠與此算法一起使用的公鑰/私鑰對。它還可以將特定于算法的參數與每個生成的密鑰關聯。
有兩種生成密鑰對的方式:與算法無關的方式和特定于算法的方式。兩種方式的唯一區別在于對象的初始化:
與算法無關的初始化
所有的密鑰對生成器遵循密鑰大小和隨機源的概念。對于不同的算法,密鑰大小的解釋也不相同(例如,對于 DSA 算法,密鑰大小對應于模的長度)。此 KeyPairGenerator 類有一個 initialize 方法,該方法帶有兩個通用的共享類型的參數。還有一個只帶有 keysize 參數的方法,它使用以最高優先級安裝的提供者的 SecureRandom 實現作為隨機源。(如果任何安裝的提供者都不提供 SecureRandom 的實現,則使用系統提供的隨機源。)
因為調用上述與算法無關的 initialize 方法時沒有指定其他參數,所以由提供者決定如何處理與每個密鑰關聯的特定于算法的參數(如果有)。
如果算法為 DSA 算法,密鑰大小(模大小)為 512、768 或 1024,那么 Sun 提供者對 p、q 和 g 參數使用一組預計算值。如果模大小不是上述值之一,則 Sun 提供者創建一個新的參數集合。其他提供者可能具有供更多模大小(不僅僅是上文提及的那三個)使用的預計算參數集合。其他提供者也可能沒有任何預計算參數列表,而總是創建新的參數集合。
特定于算法的初始化
對于特定于算法的參數集合已存在的情況(例如,DSA 中所謂的公用參數),有兩個 initialize 方法具有 AlgorithmParameterSpec 參數。其中一個方法還有一個 SecureRandom 參數,而另一個方法使用以最高優先級安裝的提供者的 SecureRandom 實現作為隨機源。(如果任何安裝的提供者都不提供 SecureRandom 的實現,則使用系統提供的隨機源。)
每個提供者都必須提供(并記錄)默認的初始化,以防客戶端沒有顯式初始化 KeyPairGenerator(通過調用 initialize 方法)。例如,Sun 提供者使用 1024 位的默認模大小(密鑰大小)。
注意,由于歷史原因,此類是抽象類,是從 KeyPairGeneratorSpi 擴展的。應用程序開發人員只需注意在此 KeyPairGenerator 類中定義的方法;超類中的所有方法是供加密服務提供者使用的,這些加密服務提供者希望提供自己的密鑰對生成器實現。
Java提供的`KeyPairGenerator`類。 用于生成公鑰和私鑰對。 要使用`KeyPairGenerator`類生成密鑰,按照以下步驟操作。
第1步:創建KeyPairGenerator對象
KeyPairGenerator類提供getInstance()方法,該方法接受表示所需密鑰生成算法的String變量,并返回生成密鑰的KeyPairGenerator對象。
使用getInstance()方法創建KeyPairGenerator對象,如下所示。
//Creating KeyPair generator object KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");第2步:初始化KeyPairGenerator對象
KeyPairGenerator類提供了一個名為initialize()的方法,該方法用于初始化密鑰對生成器。 此方法接受表示密鑰大小的整數值。
使用此方法初始化在上一步中創建的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類生成密鑰的密鑰。
執行上面示例代碼,得到下結果:
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());總結
以上是生活随笔為你收集整理的Java非对称加密KeyPairGenerator类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nodejs 安装后 npm-v 无效,
- 下一篇: 使用Java的BlockingQueue