我有這個用于加密和解密的java代碼,我想把它改成/轉換成Ruby代碼。我在OpenSSL gem中查找,但沒有發現 "RSA/ECB/OAEPWithSHA-256AndMGF1Padding "組合可用于ruby。我怎樣才能實作它呢?
public class EncryptDecryptService{
public String encryptRequestObject(RequestObject requestObject) throws UnsupportedEncodingException, FileNotFoundException, CertificateException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
PublicKey publicKey = getPublicKey(requestObject.getKeyFilename() )。
byte[] message = requestObject.getString().getBytes("UTF-8"/span>)。
byte[] secret = encrypt(publicKey, message)。
return Base64.encodeBase64String(secret)。
}
public String decryptRequestObject(RequestObject requestObject) throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
PrivateKey privateKey = getPrivateKey(requestObject.getKeyFilename(), requestObject.getKeyPassword())。
byte[] cipherText = Base64.decodeBase64(requestObject.getString() )。
byte[] decrypted = decrypt(privateKey, cipherText)。
return new String(decrypted, "UTF-8") 。
}
private PublicKey getPublicKey(String filename) throws FileNotFoundException, CertificateException {
FileInputStream fin = new FileInputStream(filename)。
CertificateFactory factory = CertificateFactory.getInstance("X.509"/span>) 。
X509Certificate certificate = (X509Certificate) factory.generateCertificate(fin)。
PublicKey publicKey = certificate.getPublicKey()。
return publicKey。
}
private PrivateKey getPrivateKey(String filename, String password) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {
FileInputStream fin = new FileInputStream(filename)。
KeyStore ks = KeyStore.getInstance("pkcs12")。
ks.load(fin, password.toCharArray())。
String str = ks.aliases().nextElement();
PrivateKey privateKey = (PrivateKey) ks.getKey(str, password.toCharArray() ) 。
return privateKey。
}
private byte[] encrypt(PublicKey key, byte[] plainText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")。
cipher.init(Cipher.ENCRYPT_MODE, key)。
return cipher.doFinal(plainText);
}
private byte[] decrypt(PrivateKey key, byte[] cipherText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding")。
cipher.init(Cipher.DECRYPT_MODE, key)。
return cipher.doFinal(cipherText)。
}
uj5u.com熱心網友回復:
OAEP使用幾個引數,包括兩個摘要,一個用于OAEP(即用于散列OAEP標簽),一個用于掩碼生成函式(MGF1),見RFC8017, sec. 7.1。
識別符號RSA/ECB/OAEPWithSHA-256AndMGF1Padding是不明確的,取決于提供者。例如,SunJCE提供商使用SHA-256作為OAEP摘要,使用SHA-1作為MGF1摘要,BouncyCastle提供商使用SHA-256作為兩個摘要。
下面是一個用Java代碼加密和用Ruby代碼解密的例子(相反方向是模擬)。
在Java方面,使用了SunJCE提供商的WLOG,并確定了所涉及的摘要:
在Java方面,使用了SunJCE提供商的WLOG。
String pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNvs/qUMjkfq2E9o0qn03 KJE7"/span>
"ASczEbn6q kkthNBdmTsskikWsykpDPnLWhAVkmjz4alQyqw mHYP9xhx8qUC4A3"/span>
"tXY0ObxANUUKhUvR7zNj4vk4t8F2nP3erWvaG8J sN3Ubr40ZYIYLS6UHYRFrqRD"/span>
"CDhUtyjwERlz8KhLyQIDAQAB"。
KeyFactory keyFactory = KeyFactory.getInstance("RSA"/span>)。
X509EncodedKeySpec keySpec = = new X509EncodedKeySpec(Base64. getDecoder().decode(pubKey))。
RSAPublicKey publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec)。
byte[] plaintext = "The quick brown fox jumps over the lazy dog".getBytes(StandardCharsets.UTF_8)。
byte[] ciphertext = encrypt(publicKey, plaintext)。
System.out.println("Ciphertext: " Base64.getEncoder().encodeToString(ciphertext))。
與
private static byte[] encrypt(PublicKey Key, byte[] plainText) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding") 。
cipher.init(Cipher.ENCRYPT_MODE, key)。
OAEPParameterSpec oaepParameterSpec = cipher.getParameters().getParameterSpec(OAEPParameterSpec.class) 。
MGF1ParameterSpec mgf1ParameterSpec = (MGF1ParameterSpec)oaepParameterSpec.getMGFParameters();
System.out.println("Provider : " cipher.getProvider().getName())。)
System.out.println("OAEP-Hash : " oaepParameterSpec.getDigestAlgorithm() )。
System.out.println("MGF1-Hash : " mgf1ParameterSpec.getDigestAlgorithm() )。
return cipher.doFinal( plainText);
這與發布的encrypt()方法相對應(除了額外的輸出)。該代碼產生(例如)以下輸出:
Provider : SunJCE
OAEP-Hash : SHA-256
MGF1-Hash : SHA-1
密碼文本。WlozD9ojNRQafip41dpuuhBMe7ruH2FBWnMhbAaSuAtPDpHOUyKaAm6mO15BbvL3eTXyqfEQx29dYPJEbUr5T/WXs846PQN6g7Yv25EXGVbPCzc4aIbms76C1jP92wXNEGWMnu624Fq5W9MVXX75mfaY0Fjvrh5k/TFuO4AIxMk=
為了完整起見,應該提到引數的明確指定也可以用:
。
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding"/span>) 。
OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256"。"MGF1", new MGF1ParameterSpec("SHA-1"), PSource. PSpecified.DEFAULT)。)
cipher.init(Cipher.ENCRYPT_MODE, key, oaepParameterSpec)。
由于上述的矛盾性,這種明確的規范是更健全的選擇。
在摘要被確定后(因為提供者是已知的或明確地使用上述輸出),可以做一個Ruby實作。
適用于 Ruby 的可能的 OAEP 實作是 openssl-oaep.
。有了這個,用于解密的Ruby代碼可以實作如下:
require 'openssl'/span>
require 'openssl/oaep'/span>
require 'base64' >。
private_key =
'-----BEGIN PRIVATE KEY-----
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAM2 z pQyOR rYT2
jSqfTf4okTsBJzMRufqr6SS2E0F2ZOyySKRazKSkM ctaEBWSaPPhqVDKrD6Ydg/
3GHypQLgDe1djQ5vEA1RQqFS9HvM2Pi Ti3wXac/d6ta9obwn6w3dRuvjRlghgt
LpQdhEWupEMIOFS3KPARGXPwqEvJAgMBAAECgYADxGqqL7B9/pPOy3TqQuB6tuNx
4SOGm9x76onqUisoF7LhYqJR4Be/LAKHSR2PkATpKvOcMw6lDvCbtQ j rSK2PkN
4iDi1RYqbLUbZBS8vhrgU0CPlmgSSp1NBsqMK9265CaJox3frxmBK1yuf22RboIK
pqOzcluuA4aqLegmwQJBAP0 gM/tePzx 53DrxpYQvlfi9UJo7KeqIFL8TjMziKt
EaRGeOZ6UX/r6CQHojYKnti7pjAwonsdwCTcv1yy7sCQQDP /ww49VFHErON/MO
w5iYCsrM5Lx Yc2JAjetCDpkMrRT92cgQ0nxR5 jNeh gE2AmB9iKlNxsHJoRaPQ
lBRLAkEAl9hiZEp/wStXM8GhvKovfldMAPFGtlNrthtTCDvFXgVoDpgy5f9x3sIU
74WkPcMfSmyHpA/wlcKzmCTRTicHAQJBALUjq7MQ2tAEIgqUo/W52I6i55mnpZsU
pyOqcL8cqW5W0sNGd SbdizTym8lJkX2jIlw8/RVFLOxjxLNhCzGqx0CQQDeUMnw
7KGP3F7BnbsXCp64YDdihzSO5X/Mfwxw6 S/pyKZ0/X4uwt24kZuoDnFzGWJYlea
sDQC6enIru ne5es
-----END PRIVATE KEY-----'
key = OpenSSL::Key::RSA.new(private_key)
label = ''/span>
md_oaep = OpenSSL::Digest::SHA256
md_mgf1 = OpenSSL::Digest::SHA1
cipher_text_B64 = 'WlozD9ojNRQafip41dpuuhBMe7ruH2FBWnMhbAaSuAtPDpHOUyKaAm6mO15BbvL3eTXyqfEQx29dYPJEbUr5T/WXs846PQN6g7Yv25EXGVbPCzc4aIbms76C1jP92wXNEGWMnu624Fq5W9MVXX75mfaY0Fjvrh5k/TFuO4AIxMk='
cipher_text = Base64.decode64(cipher_text_B64)
plain_text = key.private_decrypt_oaep(cipher_text, label, md_oaep, md_mgf1)
print(plain_text) # The quick brown fox jumps over the lazy dog[/span]。
以原始明文作為輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313848.html
標籤:
上一篇:活躍的資源軌道沒有取到資料
