一些加密方法

Posted 弋小木

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些加密方法相关的知识,希望对你有一定的参考价值。

.h中的方法名

#import <Foundation/Foundation.h>

@interface NSData (Security)
- (NSData *)AES256EncryptWithKey:(NSString *)key;
- (NSData *)AES256DecryptWithKey:(NSString *)key;


- (NSString*)Base64Encode;
- (NSString*)Base64Decode;
@end


@interface NSString (Security)
-(NSString*)AES256Encrypt:(NSString*)key;
-(NSString*)AES256Dncrypt:(NSString*)key;


- (NSString *)MD5EncryptLower;
- (NSString *)MD5EncryptUpper;


- (NSString*)Base64Encode;
- (NSString*)Base64Decode;
@end

.m文件中

#import "XYZSecurity.h"
#import <CommonCrypto/CommonCryptor.h>
#import <CommonCrypto/CommonDigest.h>
#import "GTMBase64.h"
@implementation NSData (Security)
- (NSData *)AES256EncryptWithKey:(NSString *)key   //加密
{
    NSData *keyData1;
    NSData* bytes = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSInteger length = 32;
    
    if (bytes.length>32) {
        length = bytes.length;
    }
    char keyPtr0[length+1];
    bzero(keyPtr0,sizeof(keyPtr0));
    [key getCString:keyPtr0 maxLength:sizeof(keyPtr0) encoding:NSUTF8StringEncoding];
    keyData1 = [[NSData alloc] initWithBytes:keyPtr0 length:32];
    //AES256加密,密钥应该是32位的
    //对于块加密算法,输出大小总是等于或小于输入大小加上一个块的大小
    //所以在下边需要再加上一个块的大小
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding/*这里就是刚才说到的PKCS7Padding填充了*/ | kCCOptionECBMode,
                                          [keyData1 bytes], kCCKeySizeAES256,
                                          NULL,/* 初始化向量(可选) */
                                          [self bytes], dataLength,/*输入*/
                                          buffer, bufferSize,/* 输出 */
                                          &numBytesEncrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);//释放buffer
    return nil;
    
}


-(NSData *)AES256DecryptWithKey:(NSString *)key
{
    // ‘key‘ should be 32 bytes for AES256, will be null-padded otherwise
    
    NSData* bytes = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSInteger length = 32;
    
    if (bytes.length>32) {
        length = bytes.length;
    }
    
    char keyPtr[length+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    
    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [self length];
    
    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That‘s why we need to add the size of one block here
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer); //free the buffer;
    return nil;
    
}

- (NSString*)Base64Encode{
    NSData* data = [GTMBase64 encodeData:self];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return base64String;
}
- (NSString*)Base64Decode{
    NSData* data = [GTMBase64 decodeData:self];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return base64String;
}
@end
@implementation NSString (Security)
-(NSString*)AES256Encrypt:(NSString*)key{
    NSData * plain=[self dataUsingEncoding:NSUTF8StringEncoding];
    NSData * cipher=[plain AES256EncryptWithKey:key];
    NSString * string=[cipher base64EncodedStringWithOptions:0];
    return string;
}
-(NSString*)AES256Dncrypt:(NSString*)key{
    NSData * plain=[self dataUsingEncoding:NSUTF8StringEncoding];
    NSData * cipher=[plain AES256DecryptWithKey:key];
    NSString * string=[cipher base64EncodedStringWithOptions:0];
    return string;
}









- (NSString *)MD5EncryptLower {
    const char *str = self.UTF8String;
    uint8_t buffer[CC_MD5_DIGEST_LENGTH];
    
    CC_MD5(str, (CC_LONG)strlen(str), buffer);
    
    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
    NSMutableString *strM = [NSMutableString string];
    
    for (int i = 0; i < length; i++) {
        [strM appendFormat:@"%02x", bytes[i]];
    }
    
    return [strM copy];
}
/** 大写MD5*/
- (NSString *)MD5EncryptUpper {
    
    const char *cStr = [self UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result );
    return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
}




- (NSString*)Base64Encode{
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return base64String;
}
- (NSString*)Base64Decode{
    NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return base64String;
}
@end

以上是关于一些加密方法的主要内容,如果未能解决你的问题,请参考以下文章

Node的crypto模块使用事件方法(onreadable)加密的一些问题

如何给文档加密

安卓常见的一些加密((对称加密DES,AES),非对称加密(RSA),MD5)

Java 加密解密的方法有哪些

java【检测密码】一些网站设定了一些指定密码的规则。编写一个方法,检测一个字符串是不是是合法的密码

在java中加密文本文件的最简单方法