3

iOSおよびRubyonRailsアプリケーションで作業しており、iOSアプリからRubyonRailsアプリケーションに暗号化されたデータを送信する必要があります。私の課題は、Rails側でデコードできる方法でObjective-Cでデータをエンコードする方法です。このSOの質問の例をデータを暗号化する方法として使用しています。サンプルコードは、暗号化されたデータが次のようになることを示しています。

printf("%s\n", [[plain description] UTF8String]);

次のような出力が作成されます。

<3fe47b63 bd9a84ab 30dfb1a4 e409b60f>

私の課題は、次のようなOpenSSLコードで使用するためにデコードできる方法で、これをRailsアプリケーションにネットワーク経由で取得する方法を見つける必要があることです。

def decrypt(data)
  cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
  cipher.decrypt
  cipher.key = cipher_key
  cipher.iv = cipher_iv
  decrypted_data = cipher.update(data)
  decrypted_data << cipher.final
end

このデータはJSONリクエストのHTTPヘッダーに含まれるため、Base64エンコーディングが最善の方法であると考えています。Base64.decode64を使用してRuby側のデータをデコードし、復号化するデータとして渡すことができるようですが、これが本当に最善の方法であるかどうか、およびそれに関係なく、誰かが私を導いてくれることを願っています。エンコーディング、次のようにNSDataオブジェクトへのポインタを回す方法:

NSData *cipher = [plain AES256EncryptWithKey:key];

そのエンコードされた値に変換して、Railsアプリに取得します。ありがとう!

4

2 に答える 2

12

標準のAES暗号化を使用できます。両方のプラットフォームですばやく使用できるAES-256-CBC暗号化とBase64エンコーディングを備えたライブラリは次のとおりです。

ルビー

https://github.com/Gurpartap/aescrypt

AESCryptRubygemの使用方法は次のとおりです。

message = "top secret message"
password = "p4ssw0rd"

# Encrypting
encrypted_data = AESCrypt.encrypt(message, password)

# Decrypting
message = AESCrypt.decrypt(encrypted_data, password)

Objective-C

https://github.com/Gurpartap/AESCrypt-ObjC

AESCryptObjective-Cクラスの使用方法は次のとおりです。

NSString *message = @"top secret message";
NSString *password = @"p4ssw0rd";

// Encrypting
NSString *encryptedData = [AESCrypt encrypt:message password:password];

// Decrypting
NSString *message = [AESCrypt decrypt:encryptedData password:password];

幸運を!

于 2012-08-01T01:53:21.167 に答える
4

最終的にBase64ルートに行きました。別の SO answer で NSStringAdditions base64FromData メソッドを使用しました。

+(NSString *)encryptToBase64String:(NSString *)data {
    NSString *key = <key here>;
    NSData *plain = [data dataUsingEncoding:NSUTF8StringEncoding];
    NSData *cipher = [plain AES256EncryptWithKey:key];
    NSString *str = [NSString base64StringFromData:cipher length:[cipher length]];
    return str;
}

次に、Base 64 でエンコードされた文字列を RestKit HTTP ヘッダーに追加します。

[[RKClient sharedClient] setValue:encryptedTimestamp forHTTPHeaderField:@"<encrypted_header_value>"];
于 2012-07-22T02:05:38.040 に答える