DES 加密 解密 iOS Android PHP

作者: Eric__li | 来源:发表于2016-07-07 14:01 被阅读3601次
    PHP代码 和 iOS 代码 
    摘自 http://blog.toright.com/posts/2657/ios-objective-c-與-php-des-加解密演算法實作.html
    三个平台共用 一个密匙,尽量为8或8的倍数
    1.php代码
    
    <?php  
    /** 
     * PHP DES 加密程式 
     * 
     * @param $key 密鑰(八個字元內) 
     * @param $encrypt 要加密的明文 
     * @return string 密文 
     */  
    function encrypt ($key, $encrypt)  
    {  
        // 根據 PKCS#7 RFC 5652 Cryptographic Message Syntax (CMS) 修正 Message 加入 Padding  
        $block = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_ECB);  
        $pad = $block - (strlen($encrypt) % $block);  
        $encrypt .= str_repeat(chr($pad), $pad);  
       
        // 不需要設定 IV 進行加密  
        $passcrypt = mcrypt_encrypt(MCRYPT_DES, $key, $encrypt, MCRYPT_MODE_ECB);  
        return base64_encode($passcrypt);  
    }  
       
    /** 
     * PHP DES 解密程式 
     * 
     * @param $key 密鑰(八個字元內) 
     * @param $decrypt 要解密的密文 
     * @return string 明文 
     */  
    function decrypt ($key, $decrypt)  
    {  
        // 不需要設定 IV  
        $str = mcrypt_decrypt(MCRYPT_DES, $key, base64_decode($decrypt), MCRYPT_MODE_ECB);  
       
        // 根據 PKCS#7 RFC 5652 Cryptographic Message Syntax (CMS) 修正 Message 移除 Padding  
        $pad = ord($str[strlen($str) - 1]);  
        return substr($str, 0, strlen($str) - $pad);  
    }  
       
    $key = 'skey';  
    $plain = '0123ABCD!@#$中文';  
    $encrypt = encrypt($key, $plain);  
    $decrypt = decrypt($key, $encrypt);  
       
    echo 'plain = ' . $plain . "\n";  
    echo 'encrypt = ' . $encrypt . "\n";  
    echo 'decrypt = ' . $decrypt . "\n";  
    ?>  
    
    2.iOS 代码(如果出现无法解析,先查看是否申请的内存足够使用) 我统一1024 * 5
    之前出现解析不出, 吃了很大的亏
    
    +(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {  
        // 利用 GTMBase64 解碼 Base64 字串  
          
        NSData* cipherData = [cipherText base64DecodedData];  
        unsigned char buffer[1024];  //注意空间大小
        memset(buffer, 0, sizeof(char));  
        size_t numBytesDecrypted = 0;  
          
        // IV 偏移量不需使用  
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,  
                                              kCCAlgorithmDES,  
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                              [key UTF8String],  
                                              kCCKeySizeDES,  
                                              nil,  
                                              [cipherData bytes],  
                                              [cipherData length],  
                                              buffer,  
                                              1024,  //注意空间大小
                                              &numBytesDecrypted);  
        NSString* plainText = nil;  
        if (cryptStatus == kCCSuccess) {  
            NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];  
            plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];  
        }  
        return plainText;  
    }  
      
      
    +(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key  
    {  
        NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];  
        unsigned char buffer[1024];  //注意空间大小
        memset(buffer, 0, sizeof(char));  
        size_t numBytesEncrypted = 0;  
          
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,  
                                              kCCAlgorithmDES,  
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                              [key UTF8String],  
                                              kCCKeySizeDES,  
                                              nil,  
                                              [data bytes],  
                                              [data length],  
                                              buffer,  
                                              1024,  //注意空间大小
                                              &numBytesEncrypted);  
          
        NSString* plainText = nil;  
        if (cryptStatus == kCCSuccess) {  
            NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];  
            plainText = [dataTemp base64EncodedString];  
        }else{  
    //        NSLog(@"DES加密失败");  
        }  
        return plainText;  
    }  
    
    
    3.Android 代码
    密钥  如果 密匙不足 8个 字符  java代码 要加 \0
    例如 secretKey = "xxxxxxx\0"; 
    由于我们后台设置的密匙为7位,造成了一系列的麻烦,后经过查询php 文档解决,添加secretKey = "xxxxxxx\0"; 
    
    public class Des4 {  
        // 密钥  
        private final static String secretKey = "";  
        private static byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0};  
      
        public static String encode(String plainText) throws Exception {  
            IvParameterSpec zeroIv = new IvParameterSpec(iv);  
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "DES");  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);  
            byte[] encryptedData = cipher.doFinal(plainText.getBytes());  
            return Base64.encodeToString(encryptedData, 1);  
        }  
      
        public static String decode(String encryptText) throws Exception {  
            IvParameterSpec zeroIv = new IvParameterSpec(iv);  
            SecretKeySpec key = new SecretKeySpec(secretKey.getBytes(), "DES");  
            Cipher cipher = Cipher.getInstance("DES");  
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);  
            byte[] decryptData = cipher.doFinal(Base64.decode(encryptText, 1));  
            return new String(decryptData);  
        }  
    }  
    

    相关文章

      网友评论

        本文标题:DES 加密 解密 iOS Android PHP

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