2017-11-11 44 views
2

私はあまりにも多くの暗号についてはわかりません(基本のみ)。資格情報OpenHomeサービスを実装しようとしており、パスワードを暗号化してデバイスに送信したいとします。暗号化RSA/ECB/OAEPWithSHA-256AndMGF1Padding Swift

デバイスがそのように見えるの公開鍵の文字列を返すCで記述された機能を提供:Androidの実装はすでに行われていると、与えられた仕様が

RSA/ECBある

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzjFGuEKD0uWxzb47oRbiSP2uDwVJPeWU7m9VXi626V6lameTzdtwj2eYVZTIAsAW7yW4or2skn7oHqFG4GvhMzgMwoQjKFxeCPPFXRSotnt26AN1DhvFJp3V/d+MpmkzI07iWcD5eNe4EVNK9GSE4JOEHhJ/JYBVMiu04XE5aqwIDAQAB 

を/ OAEPWithSHA-256AndMGF1Padding

を暗号化する際に "指示" を与えるウェブサイトがあります何、

SwiftyRSA、HEIMDALL、SwCrypt

私の主な障害の一つは、私が持っているもの、私を理解していないされていることを私は本当に事:私はこれまでのところ、これらのライブラリを試してみました

http://wiki.openhome.org/wiki/Av:Developer:CredentialsService

迅速にそれを達成する方法が必要ですか?

理想的な終わりに私は

func encryptMessage(message:String, whithPublicKey key:String)->String 

のような機能を持っていますどうもありがとうございました。

+0

わからないを使用していることを言及する価値!このプロセスは、ECBブロック暗号とOAEPパディングを使用してRSAにあるサーバーで共有されている公開鍵を取得して、パスワードの暗号化メッセージを生成してサーバーに返す必要があるようです。 OAEPWithSHA-256AndMGF1Paddingは非常に珍しいものですので、これをサポートするライブラリを確認してください。 – carbonr

+0

公開鍵はサーバによって与えられます。だから私は、サーバーがメッセージをdecyptingするための秘密鍵を持っていると仮定します。私は提供された公開鍵と仕様を使ってメッセージをどのように暗号化できるかを知りたい。 –

+0

"私はこれまでにこれらのライブラリを試しました..." ...そして?何が悪かったのか?これらの試みのいずれかのコードはどこにありますか? –

答えて

1

長い研究の後、私はライブラリを使用するのではなく、何が起こっているのか理解していない自分のソリューションを実装しました。何が起こるかを知ることは常に良いことであり、この場合ロケット科学ではありません。

iOSでは、暗号化/復号化を行う場合は、キーチェーンに格納されているキーを使用する必要があります。私の場合、私は公開鍵が与えられているので、私はそれをインポートすることができ、私は秘密鍵でも同じことをすることができます。私のHelperClass Hereを見てください。

func SecKeyEncrypt(_ key: SecKey, 
      _ padding: SecPadding, 
      _ plainText: UnsafePointer<UInt8>, 
      _ plainTextLen: Int, 
      _ cipherText: UnsafeMutablePointer<UInt8>, 
      _ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus 

その後、唯一のiOSの10から、あなたはiOSの10前にしたい場合は、機能を持って暗号化し、また

 let error:UnsafeMutablePointer<Unmanaged<CFError>?>? = nil 
     let plainData = "A Plain text...".data(using: .utf8) 
     if let encryptedMessageData:Data = SecKeyCreateEncryptedData(publicSecKey, .rsaEncryptionOAEPSHA256, plainData! as CFData,error) as Data?{ 
      print("We have an encrypted message") 

      let encryptedMessageSigned = encryptedMessageData.map { Int8(bitPattern: $0) } 
      print(encryptedMessageSigned) 

      if let decryptedMessage:Data = SecKeyCreateDecryptedData(privateSecKey, .rsaEncryptionOAEPSHA256, encryptedMessageData as CFData,error) as Data?{ 
       print("We have an decrypted message \(String.init(data: decryptedMessage, encoding: .utf8)!)") 
      } 
      else{ 
       print("Error decrypting") 
      } 

     } 
     else{ 
      print("Error encrypting") 
     } 

を復号化するため、この2つのメソッドを呼び出すことができますそして

func SecKeyDecrypt(_ key: SecKey, 
      _ padding: SecPadding, 
      _ cipherText: UnsafePointer<UInt8>, 
      _ cipherTextLen: Int, 
      _ plainText: UnsafeMutablePointer<UInt8>, 
      _ plainTextLen: UnsafeMutablePointer<Int>) -> OSStatus 

しかし、これらのオプションは少なく、かなりびっくりします。

Android上で生成し、私の公開鍵と秘密鍵が

public static String createStringFromPublicKey(Key key) throws Exception { 
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key.getEncoded()); 
return new String(Base64.encode(x509EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8"); 

}

public static String createStringFromPrivateKey(Key key) throws Exception { 
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key.getEncoded()); 
return new String(Base64.encode(pkcs8EncodedKeySpec.getEncoded(), Base64.NO_WRAP), "UTF-8"); 

}あなたのエラーやバリケードが何であるかを