09 - 对称密钥

2021-04-22  本文已影响0人  卡布奇诺_95d2

对称密钥

对称加密简介

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密。这种加密方法称为对称加密,也称为单密钥加密。
对加密和解密使用相同密钥的加密算法,其运算速度非常快,对称加密通常在消息发送方需要加密大量数据时使用。

常用对称加密算法

对称加密算法特点:

应用模式:

对称加密的优缺点

终端演示对称加密

echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64

//加密结果
HQr0Oij2kbo=

以下是对上述加密代码的释义:

  1. echo -n hello:不换行的标准输出 hello 字符串
  2. openssl enc:使用openssl 进行数据加密,加密的数据就是 hello 字符串
  3. -des-ecb:加密方式为 DES,加密模式为 ECB
  4. -K 616263:加密的密钥为0x61 0x62 0x63(abc)
  5. -nosalt:openssl命令,默认随机加盐,通过-nosalt参数,取消该策略
  6. base64:由于加密后的数据是二进制的,通过base64使其显示成可视字符串
echo -n HQr0Oij2kbo= | base64 -D | openssl enc -d -des-ecb -K 616263 -nosalt

//解密结果:注意%为占位符,并不是原字符串内容
hello%

释义:

  1. echo -n HQr0Oij2kbo= | base64 -D:由于前面加密后的数据是进行了base64编码,因此首先需要做的是对字符串进行base64解码。
  2. openssl enc -d:表示当前操作是解密,-e表示加密操作,默认为加密操作
  3. -des-ecb:加密方式为 DES,加密模式为 ECB
  4. -K 616263:加密的密钥为0x61 0x62 0x63(abc)
  5. -nosalt:openssl命令,默认随机加盐,通过-nosalt参数,取消该策略
//加密 hello
echo -n hello | openssl enc -des-cbc -K 616263 -nosalt -iv 0102030405060708 | base64

//加密结果
alvrvb3Gz88=
//解密 alvrvb3Gz88= 得到原字符串 hello
echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -K 616263 -nosalt -iv 0102030405060708 -d

//解密结果
hello%
//加密 hello
echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64

//加密结果
d1QG4T2tivoi0Kiu3NEmZQ==
//解密 d1QG4T2tivoi0Kiu3NEmZQ== 得到结果 hello
echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d

//解密结果
hello%
//加密 hello
echo -n hello | openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 | base64

//加密结果
u3W/N816uzFpcg6pZ+kbdg==
//解密 u3W/N816uzFpcg6pZ+kbdg== 得到结果 hello
echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -K 616263 -nosalt -iv 0102030405060708 -d

//解密结果
hello%

OC代码演示对称加密

封装EncryptionTools加密库,提供以下方法

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>

@interface EncryptionTools : NSObject
   
+ (instancetype)sharedEncryptionTools;
   
/**
    @constant   kCCAlgorithmAES     高级加密标准,128位(默认)
    @constant   kCCAlgorithmDES     数据加密标准
*/
@property (nonatomic, assign) uint32_t algorithm;
   
//加密字符串并返回base64编码字符串
- (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;

//解密字符串
- (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
   
@end
- (void)testDES_ECB:(NSString*)pwd andKey:(NSString*)key{
    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:pwd keyString:key iv:nil];
    NSLog(@"[DES_ECB]加密的结果是:%@",encStr);
    
    NSLog(@"[DES_ECB]解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
}

//结果
2021-04-22 15:58:01.344155+0800 EncryptDemo[43690:24153812] [DES_ECB]加密的结果是:HQr0Oij2kbo=
2021-04-22 15:58:01.344437+0800 EncryptDemo[43690:24153812] [DES_ECB]解密的结果是:hello
- (void)testDES_CBC:(NSString*)pwd andKey:(NSString*)key andIv:(NSData*)iv{
    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:pwd keyString:key iv:iv];
    NSLog(@"[DES_CBC]加密的结果是:%@",encStr);
    
    NSLog(@"[DES_CBC]解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:iv]);
}

//结果
2021-04-22 15:58:01.344672+0800 EncryptDemo[43690:24153812] [DES_CBC]加密的结果是:alvrvb3Gz88=
2021-04-22 15:58:01.344877+0800 EncryptDemo[43690:24153812] [DES_CBC]解密的结果是:hello
- (void)testAES_ECB:(NSString*)pwd andKey:(NSString*)key{
    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmAES;
    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:pwd keyString:key iv:nil];
    NSLog(@"[AES_ECB]加密的结果是:%@",encStr);
    
    NSLog(@"[AES_ECB]解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:nil]);
}

//结果
2021-04-22 15:58:01.345047+0800 EncryptDemo[43690:24153812] [AES_ECB]加密的结果是:d1QG4T2tivoi0Kiu3NEmZQ==
2021-04-22 15:58:01.345211+0800 EncryptDemo[43690:24153812] [AES_ECB]解密的结果是:hello
- (void)testAES_CBC:(NSString*)pwd andKey:(NSString*)key andIv:(NSData*)iv{
    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmAES;
    NSString * encStr = [[EncryptionTools sharedEncryptionTools] encryptString:pwd keyString:key iv:iv];
    NSLog(@"[AES_CBC]加密的结果是:%@",encStr);
    
    NSLog(@"[AES_CBC]解密的结果是:%@",[[EncryptionTools sharedEncryptionTools] decryptString:encStr keyString:key iv:iv]);
}

//结果
2021-04-22 15:58:01.345395+0800 EncryptDemo[43690:24153812] [AES_CBC]加密的结果是:u3W/N816uzFpcg6pZ+kbdg==
2021-04-22 15:58:01.345557+0800 EncryptDemo[43690:24153812] [AES_CBC]解密的结果是:hello

CCCrypt函数

CCCrypt函数为系统提供的加解密函数。

CCCryptorStatus CCCrypt(
   CCOperation op,         /* kCCEncrypt, etc. */
   CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
   CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
   const void *key,
   size_t keyLength,
   const void *iv,         /* optional initialization vector */
   const void *dataIn,     /* optional per op and alg */
   size_t dataInLength,
   void *dataOut,          /* data RETURNED here */
   size_t dataOutAvailable,
   size_t *dataOutMoved)
   API_AVAILABLE(macos(10.4), iOS(2.0));
enum {
   kCCAlgorithmAES128 = 0, /* Deprecated, name phased out due to ambiguity with key size */
   kCCAlgorithmAES = 0,
   kCCAlgorithmDES,
   kCCAlgorithm3DES,
   kCCAlgorithmCAST,
   kCCAlgorithmRC4,
   kCCAlgorithmRC2,
   kCCAlgorithmBlowfish
};

注意:CCCrypt函数为系统函数,它可以通过符号断点的方式,将其第七个参数截获,从而破解出待加密的数据,这是不安全的。

对称算法简单使用案例请前往Demo

上一篇 下一篇

猜你喜欢

热点阅读