美文网首页
DES加解密

DES加解密

作者: 远0 | 来源:发表于2017-10-30 09:10 被阅读61次

    我们都知道安卓和后台可以使用统一的代码去解决这个问题,这也是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[1024 * 5];
        memset(buffer, 0, sizeof(char));
        size_t numBytesEncrypted = 0;
        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:0];
        }
        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目前只支持这两种方式的加密。当然结果是已经得到验证的。

    相关文章

      网友评论

          本文标题:DES加解密

          本文链接:https://www.haomeiwen.com/subject/awxppxtx.html