zoukankan      html  css  js  c++  java
  • ios采用自带库加密解密,及php平台、java平台(andriod)数据加密解密的调试

    IOS:引入ios自带库 #include
      
         先以DES加密算法为例讲解,DES的加密和解密都同用一个Key,下面两个加解密函数如下:
    //加密
    -(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
    {
        //一般对加密的字符串采用UTF-8编码  NSData存储的就是二进制数据
        NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
        //See the doc: For block ciphers, the output size will always be less than or
        //equal to the input size plus the size of one block.
        //确定加密过后的字符串在内存中存放的大小,根据文档,对于块密码方式(这个库还包括流密码方式)
        //加密过后的字符串大小总是小于或等于加密之前数据的大小加上对应加密算法的块大小
        //但看到一些大牛还这样一下 & ~(kCCBlockSizeDES - 1) 目前不知道为嘛
        size_t bufferSize = ([data length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
        //void *buffer = malloc(bufferSize);//可以手动创建buffer,但之后要记得free掉
        unsigned char buffer[bufferSize]; //定义输出加密串所占内存空间
        memset(buffer, 0, sizeof(char));  //采用ios中宏定义好的方法分配空间,可免去手动free
        size_t numBytesEncrypted = 0;    //输出加密串的字节数
       
        //加密数据,采用库中的CCCrypt方法,这个方法会按次序执行CCCrytorCreate(),
        // CCCryptorUpdate(), CCCryptorFinal(), and CCCryptorRelease() 如果开发者自己create这个对象,
        //那么后面就必须执行final、release之类的函数,CCCrypt方法一次性解决

        // Byte iv[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
       //Byte iv[] = {1,2,3,4,5,6,7,8}; 加密所需的随机字符
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,    //加密方式,kCCEncrypt加密  kCCDecrypt解密
                                              kCCAlgorithmDES, //采用的加密算法,内置包含AES、DES、
                                                               //3DES、其他还有四个,不知道是什么
                                                               //后续讨论
                                              //加密额外参数,注意此处各个平台之间指定的时候要记得一样
                                              kCCOptionPKCS7Padding | kCCOptionECBMode,
                                              [key UTF8String], //加密密匙 UTF8的字符串
                                              kCCKeySizeDES,  //密匙长度字节 各算法有对应的长度宏
                                              nil,     //随机字符,可指定也可不指定,各平台之间不绝对
                                              [data bytes], //待加密串的字节长度
                                              [data length], //待加密串的长度
                                              buffer,        //输出已加密串的内存地址
                                              bufferSize,    //已加密串的大小
                                              &numBytesEncrypted);
       
        NSString* plainText = nil;
        if (cryptStatus == kCCSuccess) {
            NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
            plainText = [GTMBase64 stringByEncodingData:dataTemp];
        }else{
            NSLog(@"DES加密失败");
        }
        return plainText;
    }

    //解密
    -(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {
        // 利用 GTMBase64 解碼 Base64 字串
        NSData* cipherData = [GTMBase64 decodeString:cipherText];
        size_t bufferSize = ([cipherData length] + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
        //unsigned char buffer[1024];
        unsigned char buffer[bufferSize];
        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,
                                              bufferSize,//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;
    }

    java和php平台的代码实现:

    Java代码  收藏代码
    1. import java.io.IOException;  
    2. import java.security.SecureRandom;  
    3. import javax.crypto.Cipher;  
    4. import javax.crypto.SecretKey;  
    5. import javax.crypto.SecretKeyFactory;  
    6. import javax.crypto.spec.DESKeySpec;  
    7. import sun.misc.BASE64Decoder;  
    8. import sun.misc.BASE64Encoder;  
    9. public class DES  
    10.   
    11.     private byte[] desKey;  
    12.   
    13.     public DES(String desKey)  
    14.         this.desKey desKey.getBytes();  
    15.      
    16.   
    17.     public byte[] desEncrypt(byte[] plainText) throws Exception  
    18.         SecureRandom sr new SecureRandom();  
    19.         byte rawKeyData[] desKey;  
    20.         DESKeySpec dks new DESKeySpec(rawKeyData);  
    21.         SecretKeyFactory keyFactory SecretKeyFactory.getInstance("DES");  
    22.         SecretKey key keyFactory.generateSecret(dks);  
    23.         Cipher cipher Cipher.getInstance("DES");  
    24.         cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
    25.         byte data[] plainText;  
    26.         byte encryptedData[] cipher.doFinal(data);  
    27.         return encryptedData;  
    28.      
    29.   
    30.     public byte[] desDecrypt(byte[] encryptText) throws Exception  
    31.         SecureRandom sr new SecureRandom();  
    32.         byte rawKeyData[] desKey;  
    33.         DESKeySpec dks new DESKeySpec(rawKeyData);  
    34.         SecretKeyFactory keyFactory SecretKeyFactory.getInstance("DES");  
    35.         SecretKey key keyFactory.generateSecret(dks);  
    36.         Cipher cipher Cipher.getInstance("DES");  
    37.         cipher.init(Cipher.DECRYPT_MODE, key, sr);  
    38.         byte encryptedData[] encryptText;  
    39.         byte decryptedData[] cipher.doFinal(encryptedData);  
    40.         return decryptedData;  
    41.      
    42.   
    43.     public String encrypt(String input) throws Exception  
    44.         return base64Encode(desEncrypt(input.getBytes()));  
    45.      
    46.   
    47.     public String decrypt(String input) throws Exception  
    48.         byte[] result base64Decode(input);  
    49.         return new String(desDecrypt(result));  
    50.      
    51.   
    52.     public static String base64Encode(byte[] s)  
    53.         if (s == null 
    54.             return null 
    55.         BASE64Encoder new sun.misc.BASE64Encoder();  
    56.         return b.encode(s);  
    57.      
    58.   
    59.     public static byte[] base64Decode(String s) throws IOException  
    60.         if (s == null 
    61.             return null 
    62.         BASE64Decoder decoder new BASE64Decoder();  
    63.         byte[] decoder.decodeBuffer(s);  
    64.         return b;  
    65.      
    66.   
    67.     public static void main(String[] args) throws Exception  
    68.         String key "abcdefgh" 
    69.         String input "a" 
    70.         DES crypt new DES(key);  
    71.         System.out.println("Encode:" crypt.encrypt(input));  
    72.         System.out.println("Decode:" crypt.decrypt(crypt.encrypt(input)));  
    73.      
    74.  




    php 方法一
    Php代码  收藏代码
    1. <?php  
    2. class DES1      
    3.     var $key        
    4.     function    DES1($key         
    5.         $this->key $key        
    6.             
    7.     function encrypt($input       
    8.         $size mcrypt_get_block_size('des''ecb');          
    9.         $input $this->pkcs5_pad($input$size);          
    10.         $key $this->key;         
    11.         $td mcrypt_module_open('des''''ecb''');       
    12.         $iv @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);      
    13.         @mcrypt_generic_init($td$key$iv);         
    14.         $data mcrypt_generic($td$input);          
    15.         mcrypt_generic_deinit($td);      
    16.         mcrypt_module_close($td);         
    17.         $data base64_encode($data);         
    18.         return $data    
    19.             
    20.     function decrypt($encrypted       
    21.         $encrypted base64_decode($encrypted);       
    22.         $key =$this->key;          
    23.         $td mcrypt_module_open('des','','ecb','');   
    24.         //使用MCRYPT_DES算法,cbc模式                
    25.         $iv @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);            
    26.         $ks mcrypt_enc_get_key_size($td);               
    27.         @mcrypt_generic_init($td$key$iv);         
    28.         //初始处理                
    29.         $decrypted mdecrypt_generic($td$encrypted);         
    30.         //解密              
    31.         mcrypt_generic_deinit($td);         
    32.         //结束            
    33.         mcrypt_module_close($td);                 
    34.         $y=$this->pkcs5_unpad($decrypted);          
    35.         return $y   
    36.             
    37.     function pkcs5_pad ($text$blocksize         
    38.         $pad $blocksize (strlen($text$blocksize);         
    39.         return $text str_repeat(chr($pad), $pad);   
    40.         
    41.     function pkcs5_unpad($text        
    42.         $pad ord($text{strlen($text)-1});       
    43.         if ($pad strlen($text))              
    44.             return false;         
    45.         if (strspn($textchr($pad), strlen($text$pad!= $pad              
    46.             return false;         
    47.         return substr($text0, -1 $pad);   
    48.      
    49.   
    50.         $key "abcdefgh" 
    51.         $input "a" 
    52.         $crypt new DES1($key);  
    53.         echo "Encode:".$crypt->encrypt($input)."<br/>" 
    54.         echo "Decode:".$crypt->decrypt($crypt->encrypt($input));  
    55. ?>  
    http://bask.iteye.com/blog/558900
    http://download.csdn.net/download/ogogo1981/4821867  csdn上的下载包
  • 相关阅读:
    UVA-11437 Triangle Fun
    UVA 10491
    CF 223C
    poj 3273
    由异常掉电问题---谈xfs文件系统
    好久没有写博客了,最近一段时间做一下总结吧!
    Json.Net
    div 旋转
    VirtualBox虚拟机网络设置
    windows 2003 安装 MVC 环境 404错误,无法找到该页
  • 原文地址:https://www.cnblogs.com/cnsec/p/11515829.html
Copyright © 2011-2022 走看看