2013-06-14 16 views
8

Wprowadzam kod szyfrowania w języku Java/Android, aby dopasować szyfrowanie iOS. W systemie iOS szyfrowanie za pomocą protokołu RSA odbywa się za pomocą następującego schematu dopełnienia: PKCS1-OAEPCzy padding RSA PKCS1-OAEP jest obsługiwany w bouncycastle?

Jednak, gdy próbuję utworzyć szyfr z PKCS1-OAEP.

Cipher c = Cipher.getInstance("RSA/None/PKCS1-OAEP", "BC"); 

Poniżej StackTrace

javax.crypto.NoSuchPaddingException: PKCS1-OAEP unavailable with RSA. 
    at com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.CipherSpi.engineSetPadding(CipherSpi.java:240) 
    at javax.crypto.Cipher.getCipher(Cipher.java:324) 
    at javax.crypto.Cipher.getInstance(Cipher.java:237) 

Może to RSA/None/PKCS1-OAEP jest błędna? ale nie może znaleźć żadnej ostatecznej odpowiedzi, aby powiedzieć, że PKCS1-OAEP jest nieobsługiwany lub poprawny sposób jego zdefiniowania.

Używam biblioteki spongycastle, więc mam pełną implementację bouncycastle.

+0

Bez bardziej szczegółowo, że trudno powiedzieć, ale może to być coś w rodzaju 'RSA/brak/OAEPWithSHA1AndMGF1Padding', na przykład. – vcsjones

+0

@vcsjones widzę, że odnotowano na następujących http://www.bouncycastle.org/wiki/display/JA1/Frequently+Asked+Questions, ale podczas gdy to przechodzi przez wyjątek NoSuchPaddingException nie jest, t takie same wypełnienie jak "PKCS1- OAEP ". Jakie dodatkowe szczegóły mogłyby pomóc? – scottyab

+0

OAEP używa * jakiegoś * rodzaju funkcji mieszającej, niezależnie od tego, czy jest to SHA1, czy coś innego zależy od implementacji. Musimy dowiedzieć się więcej o Twojej implementacji systemu iOS. Na przykład, jeśli użyłeś 'RSA_PKCS1_OAEP_PADDING' w twojej funkcji RSA_public_encrypt, to jest SHA1 z MGF1. http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/RSA_public_encrypt.3ssl.html. Jak wygląda Twój kod iOS? – vcsjones

Odpowiedz

5

Poniższy kod działa, jeśli ktoś jest zatrzymany z kwestiami kodowania/dopełnienia podobny szyfrowania

SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(
      ASN1Sequence.getInstance(rsaPublicKey.getEncoded())); 

    AsymmetricKeyParameter param = PublicKeyFactory 
      .createKey(publicKeyInfo); 
    AsymmetricBlockCipher cipher = new OAEPEncoding(new RSAEngine(), 
      new SHA1Digest()); 
    cipher.init(true, param); 

    return cipher.processBlock(stuffIWantEncrypted, 0, 32); 
13

Kod w pierwszej odpowiedzi działa, ale nie jest to zalecane, ponieważ korzysta BouncyCastle klas wewnętrznych, zamiast Ogólne interfejsy JCA, dzięki czemu kod BouncyCastle jest specyficzny. Na przykład utrudni to przejście na dostawcę SunJCE.

Zamek Bouncy od wersji 1.50 obsługuje następujące nazwy dopełnienia OAEP.

  • RSA/brak/OAEPWithMD5AndMGF1Padding
  • RSA/brak/OAEPWithSHA1AndMGF1Padding
  • RSA/brak/OAEPWithSHA224AndMGF1Padding
  • RSA/brak/OAEPWithSHA256AndMGF1Padding
  • RSA/brak/OAEPWithSHA384AndMGF1Padding
  • RSA/brak/OAEPWithSHA512AndMGF1Padding

Następnie odpowiednie pliki uruchamiania szyfr RSA-OAEP wyglądałby

Cipher c = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC"); 
Powiązane problemy