3

我正在开发一个 iOS 和 Ruby on Rails 应用程序,需要将数据从 iOS 应用程序加密传输到 Ruby on Rails 应用程序。我的挑战是如何以我可以在 Rails 端解码的方式对 Objective-C 中的数据进行编码。我使用这个 SO question 中的示例作为加密数据的方法,示例代码显示了加密数据的样子:

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

这会创建如下所示的输出:

<3fe47b63 bd9a84ab 30dfb1a4 e409b60f>

我面临的挑战是,我需要找到一种方法将其通过网络传输到 Rails 应用程序,以便我可以解码以与 OpenSSL 代码一起使用,例如:

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

我认为 Base64 编码可能是最好的方法,因为这些数据最终会出现在 JSON 请求的 HTTP 标头中。似乎我可以使用 Base64.decode64 来解码 Ruby 端的数据并将其作为要解密的数据传递,但我希望有人可以指导我这是否真的是最好的方法,并且不管编码,如何将指针转换为 NSData 对象,如下所示:

NSData *cipher = [plain AES256EncryptWithKey:key];

进入该编码值以将其发送到 Rails 应用程序。谢谢!

4

2 回答 2

12

您可以使用标准的 AES 加密。以下是您可以在两个平台上快速使用的带有 AES-256-CBC 密码和 Base64 编码的库:

红宝石

https://github.com/Gurpartap/aescrypt

以下是使用 AESCrypt Ruby gem 的方法:

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

以下是使用 AESCrypt Objective-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 答案中使用了 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 回答