我们在项目中为了安全方面的考虑,通常情况下会选择一种加密方式对需要安全性的文本进行加密,而Base64加密和DES64加密是常用的加密算法。我记得我在前一个项目中使用的就是这两种加密算法的结合:Base64 + DES加密。当然这需要移动端和后台服务器做一个统一。

1、Base64加解密

值得一提的是:apple提供了基础的Base64加解密算法。这样我们就可以直接使用方法去实现Base64加解密。先看一下apple都提供了哪些方法:

@interface NSData (NSDataBase64Encoding)

/* Create an NSData from a Base-64 encoded NSString using the given options. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0); /* Create a Base-64 encoded NSString from the receiver's contents using the given options.
*/
- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0); /* Create an NSData from a Base-64, UTF-8 encoded NSData. By default, returns nil when the input is not recognized as valid Base-64.
*/
- (nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0); /* Create a Base-64, UTF-8 encoded NSData from the receiver's contents using the given options.
*/
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0); @end
@interface NSData (NSDeprecated)
/* These methods first appeared in NSData.h on OS X 10.9 and iOS 7.0.
They are deprecated in the same releases in favor of the methods in the NSDataBase64Encoding category.
However, these methods have existed for several releases, so they may be used for applications targeting releases prior to OS X 10.9 and iOS 7.0.
*/
- (nullable id)initWithBase64Encoding:(NSString *)base64String NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);
- (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0); @end

我们先创建一个NSData,再去一条一条的分析以上的方法

NSData *data = [@"Base64 encoding string" dataUsingEncoding:NSUTF8StringEncoding];

(1)创建一个Data(从一个Base64编码字符串使用给出的设置创建一个Data)

NSData *dataFromBase64String = [[NSData alloc]initWithBase64EncodedString:base64String options:];

(2)创建一个Base64编码字符串(从接受者内容创建)

NSString *base64String = [data base64EncodedStringWithOptions:];

(3)创建一个Data(从一个Base64、UTF-8编码的Data创建)

NSData *base64AndUTFData = [base64Data initWithBase64EncodedData:base64Data options:];

(4)创建一个Base64、UTF-8编码的Data(从接受者内容创建)

NSData *base64Data = [data base64EncodedDataWithOptions:];

当然,我们最后也可以将Data转化成String类型。

 NSString *base64Decoded = [[NSString alloc]initWithData:dataFromBase64String encoding:NSUTF8StringEncoding];

以上是Base64加解密方法。下面我们看看DES的加解密。

2、DES加解密

我们都知道安卓和后台可以使用统一的代码去解决这个问题,这也是java的优势之一吧。这里我会附一段java的代码。主要是为了下面说明java和iOS端实现中需要注意的地方(也是不同点)。

为了使说明更方便一些,我们先看一下java的DES加密方法:

/**
* EDS加密
* @param originalStr
* @return
*/
public static String Encrypt(String originalStr) {
String result = null;
byte[] tmpOriginalStr = null;
try {
if (!Tools.isEmpty(originalStr)) {
tmpOriginalStr = originalStr.getBytes("utf-8");
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
DESKeySpec dks = new DESKeySpec(KEY);
SecretKey secretKey = keyFactory.generateSecret(dks);
IvParameterSpec param = new IvParameterSpec(IV);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey,param);
byte[] tmpEncypt = cipher.doFinal(tmpOriginalStr);
if (tmpEncypt != null) {
result = Base64.encodeToString(tmpEncypt,Base64.NO_WRAP);
}
}
} catch (Exception e) {
Log.e("Erro",e.getMessage());
}
return result;
}

我们可以看出Java针对DES加密算法默认使用的是CBC模式,对齐方式采用的是PKCS5Padding。


而OC中的加密并不是java中的形式实现加密的,接下来我们看一看OC中实现DES加密的代码:

#pragma mark- 加密算法
+(NSString *) encryptUseDES:(NSString *)plainText //key:(NSString *)key
{
NSString *ciphertext = nil;
NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [textData length];
unsigned char buffer[ * ];
memset(buffer, , sizeof(char));
size_t numBytesEncrypted = ;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[key UTF8String], kCCKeySizeDES,
[iv UTF8String],
[textData bytes], dataLength,
buffer, 1024,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
ciphertext = [data base64EncodedStringWithOptions:];
}
return ciphertext;
}

先说一下代码中红色里面的绿色部分:key和iv 。key:是DES加密的公钥。而iv:是初始化的矢量。两者都是DES加密的关键参数。这个是必须要和Android、后台有个统一的。

我们可以看出OC使用的是kCCOptionPKCS7Padding对齐方式。而java中很明确的指出使用的是PKCS5Padding。接下来我们点进去看看OC中给出的对齐选择有哪些,我直接以代码的形式展示出来:

enum {
/* options for block ciphers */
kCCOptionPKCS7Padding = 0x0001,
kCCOptionECBMode = 0x0002
/* stream ciphers currently have no options */
};

OC中给出的是 kCCOptionECBMode 和 kCCOptionPKCS7Padding 这两种选择。那么,问题现在出现了。java中的DES加密算法有很多种,例如:ECB,CBC,OFB,CFB等。

java 和 OC的DES加密怎样才能实现一致性呢?(这也是我在项目中遇到的问题)。


查阅很多资料,再加上自己的很多次测试,得出的结果如下:

在JAVA中使用这种方式加密:"DES/CBC/PKCS5Padding"  对应的Object-C的是 kCCOptionPKCS7Padding

而使用 "DES/ECB/PKCS5Padding" 对应的Object-C的是   kCCOptionPKCS7Padding | kCCOptionECBMod

觉得似乎OC目前只支持这两种方式的加密。当然结果是已经得到验证的。

注意:md5加密(iOS SDK中自带了CommonCrypto)出现警告⚠️ 。

解决方法添加:引入函数定义的头文件

#import <CommonCrypto/CommonDigest.h>

其他链接:

Objective C与Java之间的DES加解密实现

iOS 7: Base64 Encode and Decode NSData and NSString Objects

这里附上demo:https://github.com/Wheat-Qin/Base64-DES

(iOS)Base64加密和DES加密、以及JAVA和iOS中DES加密统一性问题的更多相关文章

  1. IOS中DES与MD5加密方案

      0 2 项目中用的的加密算法,因为要和安卓版的适配,中间遇到许多麻烦. MD5算法和DES算法是常见的两种加密算法. MD5:MD5是一种不可逆的加密算法,按我的理解,所谓不可逆,就是不能解密,那 ...

  2. DES加密和解密PHP,Java,ObjectC统一的方法

    原文:DES加密和解密PHP,Java,ObjectC统一的方法 PHP的加解密函数 <?php class DesComponent { var $key = '12345678'; func ...

  3. DES ECB 模式 JAVA PHP C# 实现 加密 解密 兼容

    版本一: JAVA: import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; i ...

  4. Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

    一.先看一个简单加密,解密实现 1.1 加密 /** * content: 加密内容 * slatKey: 加密的盐,16位字符串 * vectorKey: 加密的向量,16位字符串 */ publi ...

  5. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  6. 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码

    JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...

  7. 【Java】JAVA-加密-DES加密代码详解

    package util; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; import javax.c ...

  8. DES加密 java与.net可以相互加密解密两种方法

    DES加密 java与.net可以相互加密解密两种方法 https://www.cnblogs.com/DrWang/archive/2011/03/30/2000124.html sun.misc. ...

  9. iOS 中的加密方式

    iOS 中的加密方式 1 加密方式主要有: Base64,MD5,RSA,DES,AES,钥匙串存储,Cookie 2 各加密方式的比较 2.1 Base64 2.1.1 基本原理:采用64个基本的 ...

随机推荐

  1. linux 乱码

    xwindow终端乱码 在/etc/sysconfig/i18n文件的最后一行添加如下内容: export LC_ALL="zh_CN.GB18030" vi /etc/sysco ...

  2. windows 7 docker oralce安装和使用

    7. oracle数据库的安装 7.1 下载镜像 查询:Docker search Oracle 下载: docker pull wnameless/oracle-xe-11g 如果不能下载,有可能是 ...

  3. 【09-03】java泛型学习笔记

    静态方法的泛型 /** * @description 静态方法的泛型无法使用类定义的泛型,因为类在实例化时才确定具体的泛型类,因此静态方法要使用泛型需要使用泛型方法的方式 */ public clas ...

  4. 07OC之KVC、KVO

    在OC中,有着很多动态的特性,今天我们着重讲讲OC中的键值编码(KVC)和键值监听(KVO)特性. 一.键值编码(KVC) 在C#中,我们可以通过反射的方式动态去读写一个对象,有时候很方便,因为可以利 ...

  5. Is there a difference between `==` and `is` in Python?

    There is a simple rule of thumb to tell you when to use == or is. == is for value equality. Use it w ...

  6. centos7+redis+php环境配置

    centos7+redis+php环境配置 下载redis(更多版本可到redis官网进行查找) wget http://download.redis.io/releases/redis-3.0.7. ...

  7. Angular2 指令

      1. 指令说明 Angular2 指令是构成Angular2应用程序的重要组成部分,指令主要用来对模板的标签或者元素附加一些新的特性或者功能,改变一个 DOM 元素的外观或行为,Angular2指 ...

  8. 【转】Android中的事件分发和处理

    原文链接:http://www.apkbus.com/home.php?mod=space&uid=705730&do=blog&id=61207 上次跟大家分享了一下自定义V ...

  9. SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)

    一. 简体中文 1. SQL Server 2008 R2 Developer (x86, x64, ia64) – DVD (Chinese-Simplified) File Name: cn_sq ...

  10. 使用微信web开发者工具调试微信企业号页面(前端页面,已发布在服务器上的)

    前几天写了一篇使用fiddler调试微信端页面的,然后博友评论说使用fiddler太麻烦了,推荐使用微信web开发者工具调试微信页面,这两天弄着玩了一下,很强大.这篇文章只是做一个记录,方便自己以后使 ...