RSADataSigner.m 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. NSString *charactersToEscape = @"!*'();:@&=+$,/?%#[]";
  20. NSCharacterSet *allowedCharacters = [[NSCharacterSet characterSetWithCharactersInString:charactersToEscape] invertedSet];
  21. NSString *encodedString = [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacters];
  22. return encodedString;
  23. }
  24. - (NSString *)formatPrivateKey:(NSString *)privateKey {
  25. const char *pstr = [privateKey UTF8String];
  26. int len = (int)[privateKey length];
  27. NSMutableString *result = [NSMutableString string];
  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 RSA PRIVATE KEY-----"];
  46. return result;
  47. }
  48. - (NSString *)algorithmName {
  49. return @"RSA";
  50. }
  51. //dansonmark
  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 = (int)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