2015-01-28 7 views
1

Как мне известно, как такие же, но один работает на одном компьютере, в то время как тот же код говорит:что почтительность между «RSA/ЕЦБ/OAEPWITHSHA256ANDMGF1PADDING» и «RSA/ЕЦБ/OAEPWITHSHA256ANDMGF1PADDING»

javax. crypto.NoSuchPaddingException: OAEPWITHSHA-256ANDMGF1PADDING недоступен с RSA на другой машине.

Когда я удаляю тире - от имени (OAEPWITHSHA256ANDMGF1PADDING), он начинает работать на другой машине, но приводит к ошибке в отношении исключения другой другой строки. В чем может быть причина?

Пример кода для Hint

Я использую jdk1.7.0_71 32bit:

private byte[] decryptSecretKeyData(byte[] encryptedSecretKey, byte[] iv, PrivateKey privateKey) throws Exception 
{ 
    try { 

     Provider provider= new sun.security.pkcs11.SunPKCS11(keyStoreFile1); 
     Security.addProvider(provider); 

     LOG.info("**************Inside decryptSecretKeyData***********************"); 
     Cipher rsaCipher = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING", provider); 

     // decrypting the session key with rsa no padding. 
     rsaCipher.init(Cipher.DECRYPT_MODE, privateKey); 

     /* The reason is RSA OAEP SHA256 is not supported in HSM. */ 
     byte[] decKey = rsaCipher.doFinal(encryptedSecretKey); 

     OAEPEncoding encode = new OAEPEncoding(new RSAEngine(), new SHA256Digest(), iv); 
     LOG.info("******************RSAPublicKey rsaPublickey = (*****************************"); 

     java.security.interfaces.RSAPublicKey rsaPublickey = (java.security.interfaces.RSAPublicKey) publicKeyFile; 
     RSAKeyParameters keyParams = new RSAKeyParameters(false, rsaPublickey.getModulus(), EXPONENT); 
     encode.init(false, keyParams); 

     LOG.info("******************encode.processBlock(decKey, 0, decKey.length);************************"); 
     byte decryptedSecKey[] = encode.processBlock(decKey, 0, decKey.length); 

     return decryptedSecKey; 
    } catch (InvalidCipherTextException e) { 
     LOG.info("*******************Failed to decrypt AES secret key using RSA :**********************"); 
     throw new Exception("Failed to decrypt AES secret key using RSA :" + e.toString()); 
    } 

} 
+0

, пожалуйста, укажите код ... – xmoex

ответ

2

RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING и RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING отличаются псевдоним, но и относится к тем же алгоритмам, так что в этом смысле нет разницы вообще ,

Дело в том, что для шифрования данных используется PKCS#11 (криптографический токен-интерфейс). Согласно Яве PKCS#11 reference:

The Sun PKCS#11 provider, in contrast to most other providers, does not implement cryptographic algorithms itself. Instead, it acts as a bridge between the Java JCA and JCE APIs and the native PKCS#11 cryptographic API, translating the calls and conventions between the two. This means that Java applications calling standard JCA and JCE APIs can, without modification, take advantage of algorithms offered by the underlying PKCS#11 implementations, such as, for example,

Cryptographic Smartcards, Hardware cryptographic accelerators, and High performance software implementations. Note that Java SE only facilitates accessing native PKCS#11 implementations, it does not itself include a native PKCS#11 implementation. However, cryptographic devices such as Smartcards and hardware accelerators often come with software that includes a PKCS#11 implementation, which you need to install and configure according to manufacturer's instructions.

Обобщенные, если вы используете PKCS#11, использование алгоритмов зависит от вендоров собственной реализации (.dll на окнах, .so на Linux ...) и несколько раз по конкретной программе поэтому проверьте: на обоих компьютерах вы используете одни и те же версии драйверов/программ для вашего токена PKCS#11, и оба они установлены правильно, потому что, возможно, в одном из них есть ошибка, которая не позволяет правильно использовать RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING.

Надеется, что это помогает,

1

Оба алгоритма предоставляются другим поставщик безопасности.

RSA/ECB/OAEPWITHSHA256ANDMGF1PADDING

обеспечивается провайдером Надувной замок, а

RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING

обеспечивается провайдером ВС ОКО. В нашем случае мы можем успешно использовать алгоритм провайдера Bouncy Castle, но если я заменяю его алгоритмом SUN JCE, тогда он дает следующую ошибку:

Exception in thread "main" javax.crypto.BadPaddingException: lHash mismatch 
at sun.security.rsa.RSAPadding.unpadOAEP(RSAPadding.java:425) 
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:274) 
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356) 
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382) 
Смежные вопросы