RSADataSigner.m 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // RSADataSigner.m
  3. // SafepayService
  4. //
  5. // Created by wenbi on 11-4-11.
  6. // Copyright 2011 __MyCompanyName__. All rights reserved.
  7. //
  8. #import "RSADataSigner.h"
  9. #import "openssl_wrapper.h"
  10. #import "NSDataEx.h"
  11. @implementation RSADataSigner
  12. - (id)initWithPrivateKey:(NSString *)privateKey {
  13. if (self = [super init]) {
  14. _privateKey = [privateKey copy];
  15. }
  16. return self;
  17. }
  18. - (NSString*)urlEncodedString:(NSString *)string
  19. {
  20. NSString * encodedString = (__bridge_transfer NSString*) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
  21. return encodedString;
  22. }
  23. - (NSString *)formatPrivateKey:(NSString *)privateKey {
  24. const char *pstr = [privateKey UTF8String];
  25. int len = [privateKey length];
  26. NSMutableString *result = [NSMutableString string];
  27. [result appendString:@"-----BEGIN PRIVATE KEY-----\n"];
  28. // [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
  29. int index = 0;
  30. int count = 0;
  31. while (index < len) {
  32. char ch = pstr[index];
  33. if (ch == '\r' || ch == '\n') {
  34. ++index;
  35. continue;
  36. }
  37. [result appendFormat:@"%c", ch];
  38. if (++count == 79)
  39. {
  40. [result appendString:@"\n"];
  41. count = 0;
  42. }
  43. index++;
  44. }
  45. [result appendString:@"\n-----END PRIVATE KEY-----"];
  46. // [result appendString:@"\n----- END RSA PRIVATE KEY-----"];
  47. return result;
  48. }
  49. - (NSString *)algorithmName {
  50. return @"RSA";
  51. }
  52. //该签名方法仅供参考,外部商户可用自己方法替换
  53. - (NSString *)signString:(NSString *)string {
  54. //在Document文件夹下创建私钥文件
  55. NSString * signedString = nil;
  56. NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  57. NSString *path = [documentPath stringByAppendingPathComponent:@"AlixPay-RSAPrivateKey"];
  58. //
  59. // 把密钥写入文件
  60. //
  61. NSString *formatKey = [self formatPrivateKey:_privateKey];
  62. [formatKey writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
  63. const char *message = [string cStringUsingEncoding:NSUTF8StringEncoding];
  64. int messageLength = strlen(message);
  65. unsigned char *sig = (unsigned char *)malloc(256);
  66. unsigned int sig_len;
  67. int ret = rsa_sign_with_private_key_pem((char *)message, messageLength, sig, &sig_len, (char *)[path UTF8String]);
  68. //签名成功,需要给签名字符串base64编码和UrlEncode,该两个方法也可以根据情况替换为自己函数
  69. if (ret == 1) {
  70. NSString * base64String = base64StringFromData([NSData dataWithBytes:sig length:sig_len]);
  71. //NSData * UTF8Data = [base64String dataUsingEncoding:NSUTF8StringEncoding];
  72. signedString = [self urlEncodedString:base64String];
  73. }
  74. free(sig);
  75. return signedString;
  76. }
  77. @end