2017-01-09 6 views
3

В настоящее время я пытаюсь написать программу, которая будет использовать криптосистему с открытым ключом, такую ​​как RSA или ElGamal. Я смотрел на различные источниках, и ближе я получил был в Bouncy Castle FIPS documentation ключе шифрования с открытым, где образцом кода для RSA является несколько проста:Эффективная реализация генерации и шифрования открытых ключей RSA в Java

public byte[] pkcs1Encrypt(RSAPublicKey pubKey, byte[] data) {  
    Cipher c = Cipher.getInstance(“RSA/NONE/PKCS1Padding”, “BCFIPS”); 
    c.init(Cipher.ENCRYPT_MODE, pubKey); 
    return c.doFinal(data); 
} 

я работал часто с симметричными ключевыми криптосистемами такими как AES и Triple-DES (DESede), но я посмотрел документацию Bouncy Castle и выяснил, что RSAPublicKey не является под-интерфейсом/классом класса SecretKey.

Есть ли способ, чтобы создать этот RSAPublicKey объект, или есть более эффективный способ реализации такого рода шифрование с замком Bouncy или ОКОМ

ответ

1

В BouncyCastle документа не ясно. cipher.init(Cipher.ENCRYPT_MODE, pubKey); требуется экземпляр java.security.interfaces.RSAPublicKey и не org.bouncycastle.asn1.pkcs.RSAPublicKey

Вы можете построить RSAPublicKey используя модуль и экспоненту, от МЭД закодированных данных, или вы можете сгенерировать новую пару ключей

//RSA public key from DER encoded data 
byte publicKeyData[] = ...; 
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyData); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PublicKey publicKey = kf.generatePublic(keySpec); 

//RSA from modulus and exponent 
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PublicKey publicKey = kf.generatePublic(keySpec); 

//Generate a key pair using a secure random algorithm 
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 
keyGen.initialize(2048, random); 
KeyPair pair = keyGen.generateKeyPair(); 
PrivateKey privateKey = pair.getPrivate(); 
PublicKey publicKey = pair.getPublic(); 
byte publicKeyData[] = publicKey.getEncoded(); 
+0

Спасибо за ваш ответ! Единственный вопрос, который у меня есть, заключается в использовании объекта 'SecureRandom' для генерации байтового массива' publicickeydata'? – FaceFTW

+0

'publicKeyData []' - это просто существующий открытый ключ, закодированный как двоичный DER 'publicKey.getEncoded()'. Я включил пример кода для генерации новой пары ключей, используя «SecureRandom». Oracle рекомендует использовать произвольный алгоритм _strong при создании дорогостоящих и долгоживущих секретов, таких как общедоступные и приватные ключи RSA. Поскольку JDK8 имеет некоторые реализации. См. Https://docs.oracle.com/javase/tutorial/security/apisign/step2.html. – pedrofb