欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DES 加密 解密 iOS Android PHP

程序员文章站 2022-03-12 19:39:45
...
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 = '[email protected]#$中文';  
$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);  
    }  
}