読者です 読者をやめる 読者になる 読者になる

RNCryptorをswiftで使う

iOS Objective-C swift プログラミング

自分でiOSアプリを作り,バックグラウンドのサーバーも自分で実装していたりすると,通信時に暗号化した文字列を送りたかったりする場合が多々あります.
もちろんSSL通信にしたりすることも重要なんですが,iPhoneの通信ログ自体はPCにつなぐと割りと簡単に見られたりするので,傍受とかそういう問題でもなくて暗号化したいことがありますよね.

ただ,iOS側はObjective-Cなりswiftで書いているわけです.
ところがサーバー側は,まずその言語で実装することはない.
JavaだったりPHPだったりRubyだったりPythonだったりするわけです.


となると,相互で同じ暗号化・復号化が出来ないと使えないですよね.

複数言語間で暗号化・復号化できちゃうRNCryptor

そんなときのために用意されている便利なPodがありまして,RNCryptorです.
RNCryptor/RNCryptor · GitHub

これはiOSもしくはMac用.



Ruby用のGemがこちら.
RNCryptor/ruby_rncryptor · GitHub


その他,C++C#JavaPHPPythonJavascript用のライブラリが用意されています.
なんて対応範囲の広い!!!


というわけでこれを早速使ってみたわけですが……


swiftだとコンパイルが通らない!

githubの説明通りにRNEncryptorswiftで呼び出すと,kRNCryptorAES256Settingsがunable to accessと言われます.

※cocoapodsを使ってインストール後,BridgingHeader内でRNEncryptor.hを呼び出しているので,RNCryptor.hの呼び出しはしているはずなのに,unable to accessになります.


つまりはswiftではこの定数が定義されていなくて,探しにいけないみたいなのですね.

Objective-Cでクラスを拡張してswiftから呼び出す

swiftで定数が呼び出せないのであれば,objective-cで定数呼び出し部分だけ書いてあげれば問題なさそうです.

Objective-Cのファイルを追加します(BridgingHeaderの設定は完了していることを前提としています).

で,この中でsettingsをkRNCryptorAES256Settingsに固定して,RNEncryptorメソッドを呼び出すメソッドを新たに作成します.


OriginalEncryptor.h

#import "RNEncryptor.h"

@interface OriginalCryp: RNEncryptor

+ (NSData *)encryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;

@end


OriginalEncryptor.m

#import "OriginalCryp.h"

@implementation OriginalCryp

+ (NSData *)encryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {

    return [self encryptData:data withSettings:kRNCryptorAES256Settings password:password error:error];
}

@end


で,OriginalEncryptor.hをBridgingHeaderで呼び出します.
RNEncryptor.hはもういらないですね.

BridgingHeader.h

#import "OriginalEncryptor.h"


と,ここまできたらswift側のソースで

  let data = "Data"
  var plainData = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
  let aPassword = "password"
  var error = NSError?()
  var encryptData = OriginalCryptor.encryptData(plainData, password: aPassword, error: &error)


と呼び出してやると,無事コンパイルを通り,暗号化が成功しました.


復号化も同じようにObjective-Cで新たにメソッドを作れば,同じように使えます.




参考


Network Programming: Using RNCryptor Library with Apple’s new Swift language