zoukankan      html  css  js  c++  java
  • iOS blowfish加密解密

    遇到一个需求,支付密码提交到服务器时使用blowfish加密,网上资料很少,找到的代码也跟在线加密出来的结果对不上,在线加密(用来确认加密结果是否有误):

    blowfish在线加密

    Blowfish加密模式:ECB

    填充模式:PKCS5Padding

    输出:base64

    字符集:UTF8

    最后在stackoverflow上找到了正解:

    https://stackoverflow.com/questions/30860101/how-to-implement-blowfish-ecb-algorithm-pkcs5-padding-in-ios

    是调用了原生API,自己稍微封装了下,写成NSString分类,分类.m文件中内容如下:

    #import <CommonCrypto/CommonCryptor.h>
    
    //核心代码
    + (NSData *)doBlowfish:(NSData *)dataIn
                   context:(CCOperation)kCCEncrypt_or_kCCDecrypt
                       key:(NSData *)key
                   options:(CCOptions)options
                        iv:(NSData *)iv
                     error:(NSError **)error
    {
        CCCryptorStatus ccStatus   = kCCSuccess;
        size_t          cryptBytes = 0;
        NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeBlowfish];
        
        ccStatus = CCCrypt( kCCEncrypt_or_kCCDecrypt,
                           kCCAlgorithmBlowfish,
                           options,
                           key.bytes,
                           key.length,
                           (iv)?nil:iv.bytes,
                           dataIn.bytes,
                           dataIn.length,
                           dataOut.mutableBytes,
                           dataOut.length,
                           &cryptBytes);
        
        if (ccStatus == kCCSuccess) {
            dataOut.length = cryptBytes;
        }
        else {
            if (error) {
                *error = [NSError errorWithDomain:@"kEncryptionError"
                                             code:ccStatus
                                         userInfo:nil];
            }
            dataOut = nil;
        }
        
        return dataOut;
    }
    //返回的是base64字符串-加密
    - (NSString *)blowFishEncodingWithKey:(NSString *)pkey{
        if (pkey.length<8 || pkey.length>56) {
            NSLog(@"key值的长度必须在[8,56]之间");
            return nil;
        }
        NSError *error;
        NSData *key = [pkey dataUsingEncoding:NSUTF8StringEncoding];
        NSString *stringOriginal = self;
        NSData *dataOriginal = [stringOriginal dataUsingEncoding:NSUTF8StringEncoding];;
        
    //    NSLog(@"key %@", key);
    //    NSLog(@"stringOriginal %@", stringOriginal);
    //    NSLog(@"dataOriginal   %@", dataOriginal);
        
        NSData *dataEncrypted = [NSString doBlowfish:dataOriginal
                                                       context:kCCEncrypt
                                                           key:key
                                                       options:kCCOptionPKCS7Padding | kCCOptionECBMode
                                                            iv:nil
                                                         error:&error];
    //    NSLog(@"dataEncrypted  %@", dataEncrypted);
        
        NSString *encryptedBase64String = [dataEncrypted base64EncodedStringWithOptions:0];
    //    NSLog(@"encryptedBase64String  %@", encryptedBase64String);
        return encryptedBase64String;
        
        
        
        
    }
    //需要base64字符串调用,返回的是解密结果-解密
    - (NSString *)blowFishDecodingWithKey:(NSString *)pkey{
        if (pkey.length<8 || pkey.length>56) {
            NSLog(@"key值的长度必须在[8,56]之间");
            return nil;
        }
        NSError *error;
        NSData *key = [pkey dataUsingEncoding:NSUTF8StringEncoding];
        
        NSData *dataToDecrypt = [[NSData alloc] initWithBase64EncodedString:self options:0];
        
        NSData *dataDecrypted = [NSString doBlowfish:dataToDecrypt
                                             context:kCCDecrypt
                                                 key:key
                                             options:kCCOptionPKCS7Padding | kCCOptionECBMode
                                                  iv:nil
                                               error:&error];
    //    NSLog(@"dataDecrypted  %@", dataDecrypted);
        
        NSString *stringDecrypted = [[NSString alloc] initWithData:dataDecrypted encoding:NSUTF8StringEncoding];
    //    NSLog(@"stringDecrypted %@", stringDecrypted);
        return stringDecrypted;
    }

    使用时只需:

    NSString * base64 = [@"123456" blowFishEncodingWithKey:@"12345678"];
    NSString * result = [base64 blowFishDecodingWithKey:@"12345678"];
    NSLog(@"加密后的base64:%@    解密结果:%@",base64,result);

    相关参考资料:

    简书(我试过这个,加密出来的结果跟网站上的结果差一部分,暂时不知道原因)

  • 相关阅读:
    Redis持久化(八)
    Redis通用命令(七)
    Redis数据结构(六)
    Redis数据结构(五)
    Redis数据结构(四)
    Redis数据结构(三)
    nodename nor servname provided, or not known
    edis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots,
    Redis与Java的链接Jedis(二)
    高并发Redis(Mac)环境配置(一)
  • 原文地址:https://www.cnblogs.com/chzheng/p/7943621.html
Copyright © 2011-2022 走看看