iOS非对称加密RSA实现

前言:

我们讲解了初级的对称加密,我想信大家也对加密以及为什么要加密有了一定的理解,但是对称加密有一个很大的缺点就是某人要是拦截到请求之后获取密文又对你的api包进行反编译得到了加密秘钥和算法,你这个密文和明文也就么什么区别了,为了更好的解决此类问题我们伟大的先辈们又提出了一种新的概念RSA非对称加密。

RSA非对称加密介绍:

  • RSA加密是一种非对称加密方式(以下内容摘自--百度百科)

1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。

其实我第一次看上面这段内容以及试图去理解RSA非对称加密的时候真是想骂人的,后来我忍住了,多读了几遍不行我又抄了几遍功夫不负有心人终于是理解了。其他都是废话,我来一步一步给大家实现。

第一步(生成私钥和公钥文件):

我使用的是MAC,上面自带了OpenSSL,当然我删除了,又用HomeBrew安装了一个较新的版本。又看了下Linux上也自带了openssl,windows上没有,可以去官网下载安装

1.终端输入openssl,进入openssl状态

2.生成一个1024位的私钥:genrsa -out rsa_private_key.pem 1024

3.利用私钥生成JAVA支持的PKCS8类型的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out pkcs8_private_key.pem

4.生成JAVA支持的PKCS8二进制类型的私钥:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform DER -nocrypt -out pkcs8_private_key.der

5.生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

6.生成iOS支持的der证书,其间用到了证书请求和自签署根证书

6.1.创建证书请求:req -new -out cert.csr -key rsa_private_key.pem  (其间会要求填写国家地区公司信息等,随便填写OR认真填写都不影响证书使用)

6.2.创建X509的自签署跟证书(iOS支持X509,有效期3650天):x509 -req -in cert.csr -out rsa_public_key.der -outform der -signkey rsa_private_key.pem -days 3650

完成了以上的步骤后应该在你所在的目录下生成了6个文件


1416859-d09524d24befc11e.png

第二步(代码的封装):

  • 新建RSAEncryptor继承NSObject
RSAEncryptor.h实现:
   /**
   *  加密方法
   *
   *  @param str   需要加密的字符串
   *  @param path  '.der'格式的公钥文件路径
   *  @param Base64  是否编码为Base64
   */
  + (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path isBase64:(BOOL)Base64;
  /**
   *  解密方法
   *
   *  @param str       需要解密的字符串
   *  @param path      '.p12'格式的私钥文件路径
   *  @param password  私钥文件密码
   *  @param Base64  是否编码为Base64
   */
  + (NSString *)decryptString:(NSString *)str privateKeyWithContentsOfFile:(NSString *)path password:(NSString *)password isBase64:(BOOL)Base64;
  /**
   *  加密方法
   *
   *  @param str    需要加密的字符串
   *  @param pubKey 公钥字符串
   *  @param Base64  是否编码为Base64
   */
  + (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey isBase64:(BOOL)Base64;
  /**
   *  解密方法
   *
   *  @param str     需要解密的字符串
   *  @param privKey 私钥字符串
   *  @param Base64  是否编码为Base64
   */
  + (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey isBase64:(BOOL)Base64;
RSAEncryptor.m实现:
  #pragma mark - 64位编码 -加密
  static NSString *base64_encode_data(NSData *data){
      data = [data base64EncodedDataWithOptions:0];
      NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      return ret;
  }
  #pragma mark - 64位编码 -解密
  static NSData *base64_decode(NSString *str){
      NSData *data = [[NSData alloc] initWithBase64EncodedString:str    options:NSDataBase64DecodingIgnoreUnknownCharacters];
      return data;
  }
  #pragma mark - 16位编码 -加密
  + (NSString *)dataTohexString:(NSData*)data
  {
      Byte *bytes = (Byte *)[data bytes];
      NSString *hexStr=@"";
      for(int i=0;i<[data length];i++)
      {
          NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];//16进制数
          if([newHexStr length]==1)
              hexStr = [NSString  stringWithFormat:@"%@0%@",hexStr,newHexStr];
          else
              hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
      }
      return hexStr;
  }
  #pragma mark - 16位编码 -解密
  + (NSData*)hexStringToData:(NSString*)hexString
  {
      int j=0;
      Byte bytes[hexString.length];  ///3ds key的Byte 数组, 128位
      for(int i=0;i<[hexString length];i++)
      {
          int int_ch;  /// 两位16进制数转化后的10进制数     
          unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
          int int_ch1;
          if(hex_char1 >= '0' && hex_char1 <='9')
              int_ch1 = (hex_char1-48)*16;   //// 0 的Ascll - 48
          else if(hex_char1 >= 'A' && hex_char1 <='F')
              int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
          else
              int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97
          i++;    
          unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
          int int_ch2;
          if(hex_char2 >= '0' && hex_char2 <='9')
              int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
          else if(hex_char1 >= 'A' && hex_char1 <='F')
              int_ch2 = hex_char2-55; //// A 的Ascll - 65
          else
              int_ch2 = hex_char2-87; //// a 的Ascll - 97
              int_ch = int_ch1+int_ch2;
              //NSLog(@"int_ch=%x",int_ch);
              bytes[j] = int_ch;  ///将转化后的数放入Byte数组里
              j++;
          }
       //    NSData *newData = [[NSData alloc] initWithBytes:bytes length:j];
      NSData *newData = [[NSData alloc] initWithBytes:bytes length:j];
      //NSLog(@"newData=%@",newData);
      return newData;
  }
  #pragma mark - 使用'.der'公钥文件加密
  + (NSString *)encryptString:(NSString *)str publicKeyWithContentsOfFile:(NSString *)path isBase64:   (BOOL)Base64{
      if (!str || !path)  return nil;
      return [self encryptString:str publicKeyRef:[self getPublicKeyRefWithContentsOfFile:path] isBase64:Base64];
  }
  //获取公钥
  + (SecKeyRef)getPublicKeyRefWithContentsOfFile:(NSString *)filePath{
      NSData *certData = [NSData dataWithContentsOfFile:filePath];
      if (!certData) {
          return nil;
      }
      SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)certData);
      SecKeyRef key = NULL;
      SecTrustRef trust = NULL;
      SecPolicyRef policy = NULL;
      if (cert != NULL) {
          policy = SecPolicyCreateBasicX509();
          if (policy) {
              if (SecTrustCreateWithCertificates((CFTypeRef)cert, policy, &trust) == noErr) {
                  SecTrustResultType result;
                  if (SecTrustEvaluate(trust, &result) == noErr) {
                      key = SecTrustCopyPublicKey(trust);
                  }
              }
          }
      }
      if (policy) CFRelease(policy);
      if (trust) CFRelease(trust);
      if (cert) CFRelease(cert);
      return key;
  }
  + (NSString *)encryptString:(NSString *)str publicKeyRef:(SecKeyRef)publicKeyRef isBase64:(BOOL)Base64{
      if(![str dataUsingEncoding:NSUTF8StringEncoding]){
          return nil;
      }
      if(!publicKeyRef){
          return nil;
      }
      NSData *data = [self encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] withKeyRef:publicKeyRef];
      NSString *ret = nil;
      if (Base64) {
          //64位编码
          ret = base64_encode_data(data);
      }else{
          //16位编码
          ret = [self dataTohexString:data];
      }
      return ret;
  }
  #pragma mark - 使用'.12'私钥文件解密
  + (NSString *)decryptString:(NSString *)str privateKeyWithContentsOfFile:(NSString *)path password:(NSString *)password isBase64:(BOOL)Base64{
      if (!str || !path) return nil;
      if (!password) password = @"";
      return [self decryptString:str privateKeyRef:[self getPrivateKeyRefWithContentsOfFile:path password:password] isBase64:Base64];
  }
  //获取私钥
  + (SecKeyRef)getPrivateKeyRefWithContentsOfFile:(NSString *)filePath password:(NSString*)password{   
      NSData *p12Data = [NSData dataWithContentsOfFile:filePath];
      if (!p12Data) {
          return nil;
      }
      SecKeyRef privateKeyRef = NULL;
      NSMutableDictionary * options = [[NSMutableDictionary alloc] init];
      [options setObject: password forKey:(__bridge id)kSecImportExportPassphrase];
      CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
      OSStatus securityError = SecPKCS12Import((__bridge CFDataRef) p12Data, (__bridge CFDictionaryRef)options, &items);
      if (securityError == noErr && CFArrayGetCount(items) > 0) {
          CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0);
          SecIdentityRef identityApp = (SecIdentityRef)CFDictionaryGetValue(identityDict, kSecImportItemIdentity);
          securityError = SecIdentityCopyPrivateKey(identityApp, &privateKeyRef);
          if (securityError != noErr) {
              privateKeyRef = NULL;
          }
      }
      CFRelease(items);   
      return privateKeyRef;
  }
  + (NSString *)decryptString:(NSString *)str privateKeyRef:(SecKeyRef)privKeyRef isBase64:(BOOL)Base64{    
      NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
      if (!privKeyRef) {
          return nil;
      }
      if (Base64) {
          //64位编码
          data = [self decryptData:data withKeyRef:privKeyRef];
      }else{
          //16位编码
          data = [self decryptData:[self hexStringToData:str] withKeyRef:privKeyRef];    
      } 
      NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      return ret;
  }
  #pragma mark - 使用公钥字符串加密
  /* START: Encryption with RSA public key */
  //使用公钥字符串加密
  + (NSString *)encryptString:(NSString *)str publicKey:(NSString *)pubKey isBase64:(BOOL)Base64{
      NSData *data = [self encryptData:[str dataUsingEncoding:NSUTF8StringEncoding] publicKey:pubKey];
      NSString * ret = nil;    
      if (Base64) {
          //64位编码
          ret = base64_encode_data(data);
      }else{
          //16位编码
          ret = [self dataTohexString:data];
      }
      return ret;
  }
  + (NSData *)encryptData:(NSData *)data publicKey:(NSString *)pubKey{
      if(!data || !pubKey){
          return nil;
      }
      SecKeyRef keyRef = [self addPublicKey:pubKey];
      if(!keyRef){
          return nil;
      }      
      return [self encryptData:data withKeyRef:keyRef];
  }
  + (SecKeyRef)addPublicKey:(NSString *)key{
      NSRange spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"];
      NSRange epos = [key rangeOfString:@"-----END PUBLIC KEY-----"];
      if(spos.location != NSNotFound && epos.location != NSNotFound){
          NSUInteger s = spos.location + spos.length;
          NSUInteger e = epos.location;
          NSRange range = NSMakeRange(s, e-s);
          key = [key substringWithRange:range];
  }
      key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];
      // This will be base64 encoded, decode it.
      NSData *data = base64_decode(key);
      data = [self stripPublicKeyHeader:data];
      if(!data){
          return nil;
      }
      //a tag to read/write keychain storage
      NSString *tag = @"RSAUtil_PubKey";
      NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
      // Delete any old lingering key with the same tag
      NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
      [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
      [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
      [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
      SecItemDelete((__bridge CFDictionaryRef)publicKey);
      // Add persistent version of the key to system keychain
      [publicKey setObject:data forKey:(__bridge id)kSecValueData];
      [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)
       kSecAttrKeyClass];
      [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)
       kSecReturnPersistentRef];
      CFTypeRef persistKey = nil;
      OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);
      if (persistKey != nil){
    CFRelease(persistKey);
      }
      if ((status != noErr) && (status != errSecDuplicateItem)) {
          return nil;
      }
      [publicKey removeObjectForKey:(__bridge id)kSecValueData];
      [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
      [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
      [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
      // Now fetch the SecKeyRef version of the key
      SecKeyRef keyRef = nil;
      status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);
      if(status != noErr){
          return nil;
      }      
      return keyRef;
        }
        + (NSData *)stripPublicKeyHeader:(NSData *)d_key{
            // Skip ASN.1 public key header
            if (d_key == nil) return(nil);
            unsigned long len = [d_key length];
            if (!len) return(nil);
            unsigned char *c_key = (unsigned char *)[d_key bytes];
            unsigned int  idx     = 0;
            if (c_key[idx++] != 0x30) return(nil);
            if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
            else idx++;
            // PKCS #1 rsaEncryption szOID_RSA_RSA
            static unsigned char seqiod[] =
            { 0x30,   0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
          0x01, 0x05, 0x00 };
            if (memcmp(&c_key[idx], seqiod, 15)) return(nil);
            idx += 15;
            if (c_key[idx++] != 0x03) return(nil);
            if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1;
            else idx++;
            if (c_key[idx++] != '\0') return(nil);
            // Now make a new NSData from this buffer
            return ([NSData dataWithBytes:&c_key[idx] length:len - idx]);
  }
  + (NSData *)encryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{
      const uint8_t *srcbuf = (const uint8_t *)[data bytes];
      size_t srclen = (size_t)data.length;
      size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);      
      void *outbuf = malloc(block_size);
      size_t src_block_size = block_size - 11;
      NSMutableData *ret = [[NSMutableData alloc] init];
      for(int idx=0; idx<srclen; idx+=src_block_size){
          //NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
          size_t data_len = srclen - idx;
          if(data_len > src_block_size){
              data_len = src_block_size;
          }
          size_t outlen = block_size;
          OSStatus status = noErr;
          status = SecKeyEncrypt(keyRef,
                                 kSecPaddingPKCS1,
                                 srcbuf + idx,
                                 data_len,
                                 outbuf,
                                 &outlen
                                 );
          if (status != 0) {
              NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
              ret = nil;
              break;
          }else{
              [ret appendBytes:outbuf length:outlen];
          }
      }   
      free(outbuf);
      CFRelease(keyRef);
      return ret;
  }
  /* END: Encryption with RSA public key */
  #pragma mark - 使用私钥字符串解密
  /* START: Decryption with RSA private key */
  //使用私钥字符串解密
  + (NSString *)decryptString:(NSString *)str privateKey:(NSString *)privKey isBase64:(BOOL)Base64{
      if (!str) return nil;      
      NSData *data = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
      data = [self decryptData:data privateKey:privKey       isBase64:Base64];
      NSString *ret = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      return ret;
  }
  + (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey isBase64:(BOOL)Base64{
      if(!data || !privKey){
          return nil;
      }
      SecKeyRef keyRef = [self addPrivateKey:privKey];
      if(!keyRef){
          return nil;
      }
      if (Base64) {
          //64位编码
          data = [self decryptData:data withKeyRef:keyRef];
      }else{
          //16位编码
          data = [self decryptData:data withKeyRef:keyRef];
      }
      return data;
  }
  + (SecKeyRef)addPrivateKey:(NSString *)key{
      NSRange spos = [key rangeOfString:@"-----BEGIN RSA PRIVATE KEY-----"];
      NSRange epos = [key rangeOfString:@"-----END RSA PRIVATE KEY-----"];
      if(spos.location != NSNotFound && epos.location != NSNotFound){
          NSUInteger s = spos.location + spos.length;
          NSUInteger e = epos.location;
          NSRange range = NSMakeRange(s, e-s);
          key = [key substringWithRange:range];
      }
      key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];
      key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];
      // This will be base64 encoded, decode it.
      NSData *data = base64_decode(key);
      data = [self stripPrivateKeyHeader:data];
      if(!data){
          return nil;
      }    
      //a tag to read/write keychain storage
      NSString *tag = @"RSAUtil_PrivKey";
      NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];  
      // Delete any old lingering key with the same tag
      NSMutableDictionary *privateKey = [[NSMutableDictionary alloc] init];
      [privateKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];
      [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
      [privateKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];
      SecItemDelete((__bridge CFDictionaryRef)privateKey);
      // Add persistent version of the key to system keychain
      [privateKey setObject:data forKey:(__bridge id)kSecValueData];
      [privateKey setObject:(__bridge id) kSecAttrKeyClassPrivate forKey:(__bridge id)
       kSecAttrKeyClass];
      [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)
       kSecReturnPersistentRef];
      CFTypeRef persistKey = nil;
      OSStatus status = SecItemAdd((__bridge CFDictionaryRef)privateKey, &persistKey);
      if (persistKey != nil){
          CFRelease(persistKey);
      }
      if ((status != noErr) && (status != errSecDuplicateItem)) {
          return nil;
      }
      [privateKey removeObjectForKey:(__bridge id)kSecValueData];
      [privateKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];
      [privateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
      [privateKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
      // Now fetch the SecKeyRef version of the key
      SecKeyRef keyRef = nil;
      status = SecItemCopyMatching((__bridge CFDictionaryRef)privateKey, (CFTypeRef *)&keyRef);
      if(status != noErr){
          return nil;
      }
      return keyRef;
  }
  + (NSData *)stripPrivateKeyHeader:(NSData *)d_key{
      // Skip ASN.1 private key header
      if (d_key == nil) return(nil);    
      unsigned long len = [d_key length];
      if (!len) return(nil);    
      unsigned char *c_key = (unsigned char *)[d_key bytes];
      unsigned int  idx     = 22; //magic byte at offset 22    
      if (0x04 != c_key[idx++]) return nil;    
      //calculate length of the key
      unsigned int c_len = c_key[idx++];
      int det = c_len & 0x80;
      if (!det) {
          c_len = c_len & 0x7f;
      } else {
          int byteCount = c_len & 0x7f;
          if (byteCount + idx > len) {
              //rsa length field longer than buffer
              return nil;
          }
          unsigned int accum = 0;
          unsigned char *ptr = &c_key[idx];
          idx += byteCount;
          while (byteCount) {
              accum = (accum << 8) + *ptr;
              ptr++;
              byteCount--;
          }
          c_len = accum;
      }
      // Now make a new NSData from this buffer
      return [d_key subdataWithRange:NSMakeRange(idx, c_len)];
  }
  + (NSData *)decryptData:(NSData *)data withKeyRef:(SecKeyRef) keyRef{
      const uint8_t *srcbuf = (const uint8_t *)[data bytes];
      size_t srclen = (size_t)data.length;    
      size_t block_size = SecKeyGetBlockSize(keyRef) * sizeof(uint8_t);
      UInt8 *outbuf = malloc(block_size);
      size_t src_block_size = block_size;    
      NSMutableData *ret = [[NSMutableData alloc] init];
      for(int idx=0; idx<srclen; idx+=src_block_size){
          //NSLog(@"%d/%d block_size: %d", idx, (int)srclen, (int)block_size);
          size_t data_len = srclen - idx;
          if(data_len > src_block_size){
              data_len = src_block_size;
          }
          size_t outlen = block_size;
          OSStatus status = noErr;
          status = SecKeyDecrypt(keyRef,
                           kSecPaddingNone,
                                 srcbuf + idx,
                                 data_len,
                                 outbuf,
                                 &outlen
                                 );
          if (status != 0) {
              NSLog(@"SecKeyEncrypt fail. Error Code: %d", status);
              ret = nil;
        break;      
          }else{
              //the actual decrypted data is in the middle, locate it!
              int idxFirstZero = -1;
              int idxNextZero = (int)outlen;
              for ( int i = 0; i < outlen; i++ ) {
                  if ( outbuf[i] == 0 ) {
                      if ( idxFirstZero < 0 ) {
                          idxFirstZero = i;
                      } else {
                          idxNextZero = i;
                          break;
                      }
                  }
              }
              [ret appendBytes:&outbuf[idxFirstZero+1] length:idxNextZero-idxFirstZero-1];
          }
      } 
      free(outbuf);
      CFRelease(keyRef);
      return ret;
  }
  • 上面代码我进行了简单的封装,基本实现功能:
    1.公钥文件加密
    2.私钥文件解密
    3.公钥字符串加密
    4.私钥字符串解密
  • 以上加密解密编码格式有Base64和16位编码,按照需求传入参数便可;但是千万注意,采用那种编码之后的密文就用什么编码解密。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容