精华内容
下载资源
问答
  • DESIV向量加密

    2013-12-05 17:11:14
    DESIV向量加密
  • php进行3des加密提示iv的值过长只能为八位怎么解决![图片说明](https://img-ask.csdn.net/upload/202003/22/1584871376_601549.jpg)![图片说明](https://img-ask.csdn.net/upload/202003/22/1584871384_651943.jpg)
  • php中des加密解密匹配C#...网上找来的 php des加密解密 完全匹配上一篇C#字符串加密解密函数可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv是偏移量,默认偏移量和加密密匙是一样的, <?php cl...

    原文:php中des加密解密 匹配C#des加密解密 对称加密

    网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv 是偏移量,默认偏移量和加密密匙是一样的,
    <?php
    class DES
    {
        var $key;
        var $iv; //偏移量
        
        function DES( $key, $iv=0) {
        //key长度8例如:1234abcd
            $this->key = $key;
            if( $iv == 0 ) {
                $this->iv = $key; //默认以$key 作为 iv
            } else {
                $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
            }
        }
        
        function encrypt($str) {
        //加密,返回大写十六进制字符串
            $size = mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);
            $str = $this->pkcs5Pad ( $str, $size );
            return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
        }
        
        function decrypt($str) {
        //解密
            $strBin = $this->hex2bin( strtolower( $str ) );
            $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
            $str = $this->pkcs5Unpad( $str );
            return $str;
        }
        
        function hex2bin($hexData) {
            $binData = "";
            for($i = 0; $i < strlen ( $hexData ); $i += 2) {
                $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
            }
            return $binData;
        }
     
        function pkcs5Pad($text, $blocksize) {
            $pad = $blocksize - (strlen ( $text ) % $blocksize);
            return $text . str_repeat ( chr ( $pad ), $pad );
        }
        
        function pkcs5Unpad($text) {
            $pad = ord ( $text {strlen ( $text ) - 1} );
            if ($pad > strlen ( $text ))
                return false;
            if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
                return false;
            return substr ( $text, 0, - 1 * $pad );
        }
        
    }
    ?>
    测试
    $str = "xublog";
    $key = '12345678';
    $crypt = new DES($key);
    $mstr = $crypt->encrypt($str);
    echo "[ $str ]加密:[ $mstr ]<br>";
    $str = $crypt->decrypt($mstr);
    echo "[ $mstr ]解密:[ $str ]<br>";
     
    posted on 2014-12-08 14:45 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/4151074.html

    展开全文
  • 1、KEY和IV分别赋值 //默认密钥向量 private static byte[] Iv= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; /// <summary>... /// DES加密字符串 /// </summary> ...

    1、KEY和IV分别赋值

    //默认密钥向量
            private static byte[] Iv= { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
            /// <summary>
            /// DES加密字符串
            /// </summary>
            /// <param name="encryptString">待加密的字符串</param>
            /// <param name="encryptKey">加密密钥,要求为8位</param>
            /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
            public static string EncryptDES(string encryptString, string encryptKey)
            {
                try
                {
                    byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
                    byte[] rgbIV = Iv;
                    byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
                    DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
                    var mStream = new MemoryStream();
                    var cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey,rgbIV), CryptoStreamMode.Write);
                    cStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cStream.FlushFinalBlock();
                    return Convert.ToBase64String(mStream.ToArray());
                }
                catch
                {
                    return encryptString;
                }
            }


     

    2、根据8位密钥,建立KEY和IV

    public static string Encrypt(string pToEncrypt, string sKey)
            {
                var des = new DESCryptoServiceProvider();
                //把字符串放到byte数组中  
                byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
    
                //建立加密对象的密钥和偏移量  
                des.Key = Encoding.ASCII.GetBytes(sKey);
                des.IV = Encoding.ASCII.GetBytes(sKey);
    
                var ms = new MemoryStream();
                var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
    
                
                return Encoding.UTF8.GetString(ms.ToArray());
            }

     

    3、KEY和IV为空,调用 GenerateKey 方法以创建新的随机key ,调用 GenerateIV 方法以创建新的随机 IV

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    class EncryptorExample
    {
         private static string quote =
             "Things may come to those who wait, but only the " +
             "things left by those who hustle. -- Abraham Lincoln";
    
         public static void Main()
         {
             AesCryptoServiceProvider aesCSP = new AesCryptoServiceProvider();
    
             aesCSP.GenerateKey();
             aesCSP.GenerateIV();
             byte[] encQuote = EncryptString(aesCSP, quote);
    
             Console.WriteLine("Encrypted Quote:\n");
             Console.WriteLine(Convert.ToBase64String(encQuote));
    
             Console.WriteLine("\nDecrypted Quote:\n");
             Console.WriteLine(DecryptBytes(aesCSP, encQuote));
         }
    
         public static byte[] EncryptString(SymmetricAlgorithm symAlg, string inString)
         {
             byte[] inBlock = UnicodeEncoding.Unicode.GetBytes(inString);
             ICryptoTransform xfrm = symAlg.CreateEncryptor();
             byte[] outBlock = xfrm.TransformFinalBlock(inBlock, 0, inBlock.Length);
    
             return outBlock;
         }
    
         public static string DecryptBytes(SymmetricAlgorithm symAlg, byte[] inBytes)
         {
             ICryptoTransform xfrm = symAlg.CreateDecryptor();
             byte[] outBlock = xfrm.TransformFinalBlock(inBytes, 0, inBytes.Length);
    
             return UnicodeEncoding.Unicode.GetString(outBlock);
         }
    }

     

    另外:一般DES加密完的字符串大概长这样:U2FsdGVkX1+PX0/VZiqtq/fOMdgdX7mTQh3RNACgods=

    因为有一些特殊符号,如果拼在querystring中不便于传输,可以考虑这样写:

     var str= new StringBuilder();
     foreach (byte b in ms.ToArray())
     {
         str.AppendFormat("{0:X2}", b);
     }
     return str.ToString();

    来代替直接返回 return Encoding.UTF8.GetString(ms.ToArray());

    这样加密后的字符串长这样:4BD2B330AA45FFAD57109EE56D34E21B7E3858BA45A096220EB6634A5B779E80

     

    转载于:https://www.cnblogs.com/hydor/p/4488142.html

    展开全文
  • 可直接引用的delphi环境的3DES加密解密代码。 可直接对字符串进行解密、加密。 EncryStr4CBC、DecryStr4CBC、DecryStrHex4CBC、EncryStrHex4CBC四个方法均可选择
  • Android 平台DES IV 加密解密随笔

    千次阅读 2014-11-20 10:18:25
    Android 平台DES IV 加密解密随笔 好记性不如烂笔头,所以开始写博客了,一方面加深自己的印象,另一方面给后面初学者参考,帮助少走弯路,不论难易,有些东西可能理解的不深,欢迎各位高手指导赐教加吐槽!

    Android 平台DES IV 加密解密随笔

         DES加密接触过好多次了,但总容易忘,和服务器交互时,加出来不一致后面能解密成功但是头部是乱码导致小坑了一会,这次记录下来~

         根据网上资料和自己的理解,DES是一个基于56位密钥的对称的加密算法,就是两边的密钥需要一致,在此就不考虑为什么不用安全性更高的AES或者采用非对称加密方法,比如RSA等等;关于密钥空间小,可以使用DES的派生算法3DES来进行加密。DES算法是把64位的明文输入块变成64位的密文输出块,所以这里需要BASE64编解码工具类,加密需要3个参数(Key、Data、Mode) Mode是加密还是解密,其它就不解释了,注释写的比较清楚。

    下面是加密解密方法:

    <span style="font-size:18px;">public class EncryptUtils {
    	public static String encryptDES(String encryptString, String encryptKey)
    			throws Exception {
    		//返回实现指定转换的 Cipher 对象	“算法/模式/填充”
    		Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    		//创建一个 DESKeySpec 对象,使用 8 个字节的key作为 DES 密钥的密钥内容。
    		DESKeySpec desKeySpec = new DESKeySpec(encryptKey.getBytes("UTF-8"));
    		//返回转换指定算法的秘密密钥的 SecretKeyFactory 对象。 
    		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
    		//根据提供的密钥生成 SecretKey 对象。
    		SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
    		//使用 iv 中的字节作为 IV 来构造一个 IvParameterSpec 对象。复制该缓冲区的内容来防止后续修改。
    		IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes());
    		//用密钥和一组算法参数初始化此 Cipher;Cipher:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。
    		cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
    		//加密同时解码成字符串返回
    		return new String(BASE64.encode(cipher.doFinal(encryptString
    				.getBytes("UTF-8"))));
    	}
    
    	public static String decryptDES(String decodeString, String decodeKey) throws Exception {
    			//使用指定密钥构造IV
    			IvParameterSpec iv = new IvParameterSpec(decodeKey.getBytes());
    			//根据给定的字节数组和指定算法构造一个密钥。 
    			SecretKeySpec skeySpec = new SecretKeySpec(decodeKey.getBytes(), "DES");
    			//返回实现指定转换的 Cipher 对象
    			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    			//解密初始化
    			cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
    			//解码返回
    			byte[] byteMi = BASE64.decode(decodeString.toCharArray());
    			byte decryptedData[] = cipher.doFinal(byteMi);
    			return new String(decryptedData);
    	}
    }</span>


    几个错误需要解释下:

    java.security.InvalidAlgorithmParameterException: IV must be 8 bytes long.
    java.security.InvalidKeyException: key too short

    这两种错误都是key的长度造成的,但官方说密钥是56位长度,这个有点不太明白,但你只要记住key的长度必须是8位!这个地方还请高手赐教!

    IV向量:主要作用就是防止篡改的,这个地方如果不一致会导致数据的头部解出来是乱码,而后面正常。


    BASE64 编解码工具类

    <span style="font-size:18px;"><span style="font-size:18px;">public class BASE64 {
    	static public char[] encode(byte[] data) {
    		char[] out = new char[((data.length + 2) / 3) * 4];
    		for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
    			boolean quad = false;
    			boolean trip = false;
    			int val = (0xFF & (int) data[i]);
    			val <<= 8;
    			if ((i + 1) < data.length) {
    				val |= (0xFF & (int) data[i + 1]);
    				trip = true;
    			}
    			val <<= 8;
    			if ((i + 2) < data.length) {
    				val |= (0xFF & (int) data[i + 2]);
    				quad = true;
    			}
    			out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
    			val >>= 6;
    			out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
    			val >>= 6;
    			out[index + 1] = alphabet[val & 0x3F];
    			val >>= 6;
    			out[index + 0] = alphabet[val & 0x3F];
    		}
    		return out;
    	}
    
    	static public byte[] decode(char[] data) {
    		int len = ((data.length + 3) / 4) * 3;
    		if (data.length > 0 && data[data.length - 1] == '=')
    			--len;
    		if (data.length > 1 && data[data.length - 2] == '=')
    			--len;
    		byte[] out = new byte[len];
    		int shift = 0;
    		int accum = 0;
    		int index = 0;
    		for (int ix = 0; ix < data.length; ix++) {
    			int value = codes[data[ix] & 0xFF];
    			if (value >= 0) {
    				accum <<= 6;
    				shift += 6;
    				accum |= value;
    				if (shift >= 8) {
    					shift -= 8;
    					out[index++] = (byte) ((accum >> shift) & 0xff);
    				}
    			}
    		}
    		if (index != out.length)
    			throw new Error("miscalculated data length!");
    		return out;
    	}
    
    	static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    			.toCharArray();
    	static private byte[] codes = new byte[256];
    	static {
    		for (int i = 0; i < 256; i++)
    			codes[i] = -1;
    		for (int i = 'A'; i <= 'Z'; i++)
    			codes[i] = (byte) (i - 'A');
    		for (int i = 'a'; i <= 'z'; i++)
    			codes[i] = (byte) (26 + i - 'a');
    		for (int i = '0'; i <= '9'; i++)
    			codes[i] = (byte) (52 + i - '0');
    		codes['+'] = 62;
    		codes['/'] = 63;
    	}
    }</span></span>

    加密解密使用

    <span style="font-size:18px;">	try {
    		String en_Str = EncryptUtils.encryptDES("data20141117", "key12345");
    		String de_Str = EncryptUtils.decryptDES(en_Str, "key12345");
    		Log.i("MainActivity", "en_Str:"+en_Str);
    		Log.i("MainActivity", "de_Str:"+de_Str);
    	} catch (Exception e) {
    		e.printStackTrace();
    	}</span>


    展开全文
  • 3DES 加密

    2019-09-20 10:25:27
    今天介绍下对称加密的3DES加密。 3des加密是比较安全的对称加密算法,是3层des加密后的算法。 双方约定好相同的key,以及偏移量iv,加密模式,填充,然后进行加解密。 只有4个变量都相同才能加解密一致,所以安全...

      今天介绍下对称加密的3DES加密。

    3des加密是比较安全的对称加密算法,是3层des加密后的算法。

    双方约定好相同的key,以及偏移量iv,加密模式,填充,然后进行加解密。

    只有4个变量都相同才能加解密一致,所以安全上来说是比较安全的。

    1.加密模式包含:

    EBC、CBC、CTR、OFB、CFB

    2.填充包含:

    pcks5padding、pcks7padding 、zeropadding、iso10126、ansix923

    3 key和iv  双方约定就好了。

    以下是js的3des加密:

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>3des加解密</title>
      <meta charset="utf-8">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <script type="text/javascript" src="3DES.js"></script>
    </head>
    <body>
    <script type="text/javascript">
    var str = "15629551180";
    document.write("原字符串:</br>"+str);
    var key = "sdghjsdhgjhsdkjghioewiouew234231";         
    //alert(decrypt_3des);
    var des3en = DES3.encrypt(key,str);
    document.write("</br>des3加密后:</br>"+des3en);
    document.write("</br>des3解密后:</br>"+DES3.decrypt(key,des3en));
    </script>
    </body>

    3DES.js

    /** 
     * DES 加密算法 
     * 
     * 该函数接受一个 8 字节字符串作为普通 DES 算法的密钥(也就是 64 位,但是算法只使用 56 位),或者接受一个 24 字节字符串作为 3DES 
     * 算法的密钥;第二个参数是要加密或解密的信息字符串;第三个布尔值参数用来说明信息是加密还是解密;接下来的可选参数 mode 如果是 0 表示 ECB 
     * 模式,1 表示 CBC 模式,默认是 ECB 模式;最后一个可选项是一个 8 字节的输入向量字符串(在 ECB 模式下不使用)。返回的密文是字符串。 
     * 
     * 参数: <br> 
     * key: 8字节字符串作为普通 DES 算法的密钥,或 24 字节字符串作为 3DES <br> 
     * message: 加密或解密的信息字符串<br> 
     * encrypt: 布尔值参数用来说明信息是加密还是解密<br> 
     * mode: 1:CBC模式,0:ECB模式(默认)<br> 
     * iv:<br> 
     * padding: 可选项, 8字节的输入向量字符串(在 ECB 模式下不使用) 
     */
    //this takes the key, the message, and whether to encrypt or decrypt
    function des (key, message, encrypt, mode, iv, padding) {
      if(encrypt) //如果是加密的话,首先转换编码
        message = unescape(encodeURIComponent(message));
      //declaring this locally speeds things up a bit
      var spfunction1 = new Array (0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004);
      var spfunction2 = new Array (-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000);
      var spfunction3 = new Array (0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200);
      var spfunction4 = new Array (0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080);
      var spfunction5 = new Array (0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100);
      var spfunction6 = new Array (0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010);
      var spfunction7 = new Array (0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002);
      var spfunction8 = new Array (0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000);
      //create the 16 or 48 subkeys we will need
      var keys = des_createKeys (key);
      var m=0, i, j, temp, temp2, right1, right2, left, right, looping;
      var cbcleft, cbcleft2, cbcright, cbcright2
      var endloop, loopinc;
      var len = message.length;
      var chunk = 0;
      //set up the loops for single and triple des
      var iterations = keys.length == 32 ? 3 : 9; //single or triple des
      if (iterations == 3) {looping = encrypt ? new Array (0, 32, 2) : new Array (30, -2, -2);}
      else {looping = encrypt ? new Array (0, 32, 2, 62, 30, -2, 64, 96, 2) : new Array (94, 62, -2, 32, 64, 2, 30, -2, -2);}
      //pad the message depending on the padding parameter
      if (padding == 2) message += "    "; //pad the message with spaces
      else if (padding == 1) {
        if(encrypt) {
          temp = 8-(len%8);
          message += String.fromCharCode(temp,temp,temp,temp,temp,temp,temp,temp);
          if (temp===8) len+=8;
        }
      } //PKCS7 padding
      else if (!padding) message += "\0\0\0\0\0\0\0\0"; //pad the message out with null bytes
      //store the result here
      var result = "";
      var tempresult = "";
      if (mode == 1) { //CBC mode
        cbcleft = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++);
        cbcright = (iv.charCodeAt(m++) << 24) | (iv.charCodeAt(m++) << 16) | (iv.charCodeAt(m++) << 8) | iv.charCodeAt(m++);
        m=0;
      }
      //loop through each 64 bit chunk of the message
      while (m < len) {
        left = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
        right = (message.charCodeAt(m++) << 24) | (message.charCodeAt(m++) << 16) | (message.charCodeAt(m++) << 8) | message.charCodeAt(m++);
        //for Cipher Block Chaining mode, xor the message with the previous result
        if (mode == 1) {if (encrypt) {left ^= cbcleft; right ^= cbcright;} else {cbcleft2 = cbcleft; cbcright2 = cbcright; cbcleft = left; cbcright = right;}}
        //first each 64 but chunk of the message must be permuted according to IP
        temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
        temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16);
        temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2);
        temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
        temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
        left = ((left << 1) | (left >>> 31));
        right = ((right << 1) | (right >>> 31));
        //do this either 1 or 3 times for each chunk of the message
        for (j=0; j<iterations; j+=3) {
          endloop = looping[j+1];
          loopinc = looping[j+2];
          //now go through and perform the encryption or decryption
          for (i=looping[j]; i!=endloop; i+=loopinc) { //for efficiency
            right1 = right ^ keys[i];
            right2 = ((right >>> 4) | (right << 28)) ^ keys[i+1];
            //the result is attained by passing these bytes through the S selection functions
            temp = left;
            left = right;
            right = temp ^ (spfunction2[(right1 >>> 24) & 0x3f] | spfunction4[(right1 >>> 16) & 0x3f]
              | spfunction6[(right1 >>> 8) & 0x3f] | spfunction8[right1 & 0x3f]
              | spfunction1[(right2 >>> 24) & 0x3f] | spfunction3[(right2 >>> 16) & 0x3f]
              | spfunction5[(right2 >>> 8) & 0x3f] | spfunction7[right2 & 0x3f]);
          }
          temp = left; left = right; right = temp; //unreverse left and right
        } //for either 1 or 3 iterations
        //move then each one bit to the right
        left = ((left >>> 1) | (left << 31));
        right = ((right >>> 1) | (right << 31));
        //now perform IP-1, which is IP in the opposite direction
        temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
        temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
        temp = ((right >>> 2) ^ left) & 0x33333333; left ^= temp; right ^= (temp << 2);
        temp = ((left >>> 16) ^ right) & 0x0000ffff; right ^= temp; left ^= (temp << 16);
        temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
        //for Cipher Block Chaining mode, xor the message with the previous result
        if (mode == 1) {if (encrypt) {cbcleft = left; cbcright = right;} else {left ^= cbcleft2; right ^= cbcright2;}}
        tempresult += String.fromCharCode ((left>>>24), ((left>>>16) & 0xff), ((left>>>8) & 0xff), (left & 0xff), (right>>>24), ((right>>>16) & 0xff), ((right>>>8) & 0xff), (right & 0xff));
        chunk += 8;
        if (chunk == 512) {result += tempresult; tempresult = ""; chunk = 0;}
      } //for every 8 characters, or 64 bits in the message
      //return the result as an array
      result += tempresult;
      result = result.replace(/\0*$/g, "");
      if(!encrypt ) { //如果是解密的话,解密结束后对PKCS7 padding进行解码,并转换成utf-8编码
        if(padding === 1) { //PKCS7 padding解码
          var len = result.length, paddingChars = 0;
          len && (paddingChars = result.charCodeAt(len-1));
          (paddingChars <= 8) && (result = result.substring(0, len - paddingChars));
        }
        //转换成UTF-8编码
        result = decodeURIComponent(escape(result));
      }
      return result;
    } //end of des
    //des_createKeys
    //this takes as input a 64 bit key (even though only 56 bits are used)
    //as an array of 2 integers, and returns 16 48 bit keys
    function des_createKeys (key) {
      //declaring this locally speeds things up a bit
      var pc2bytes0 = new Array (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204);
      var pc2bytes1 = new Array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101);
      var pc2bytes2 = new Array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808);
      var pc2bytes3 = new Array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000);
      var pc2bytes4 = new Array (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010);
      var pc2bytes5 = new Array (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420);
      var pc2bytes6 = new Array (0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002);
      var pc2bytes7 = new Array (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800);
      var pc2bytes8 = new Array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002);
      var pc2bytes9 = new Array (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408);
      var pc2bytes10 = new Array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020);
      var pc2bytes11 = new Array (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200);
      var pc2bytes12 = new Array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010);
      var pc2bytes13 = new Array (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105);
      //how many iterations (1 for des, 3 for triple des)
      var iterations = key.length > 8 ? 3 : 1; //changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys
      //stores the return keys
      var keys = new Array (32 * iterations);
      //now define the left shifts which need to be done
      var shifts = new Array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);
      //other variables
      var lefttemp, righttemp, m=0, n=0, temp;
      for (var j=0; j<iterations; j++) { //either 1 or 3 iterations
        var left = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
        var right = (key.charCodeAt(m++) << 24) | (key.charCodeAt(m++) << 16) | (key.charCodeAt(m++) << 8) | key.charCodeAt(m++);
        temp = ((left >>> 4) ^ right) & 0x0f0f0f0f; right ^= temp; left ^= (temp << 4);
        temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16);
        temp = ((left >>> 2) ^ right) & 0x33333333; right ^= temp; left ^= (temp << 2);
        temp = ((right >>> -16) ^ left) & 0x0000ffff; left ^= temp; right ^= (temp << -16);
        temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
        temp = ((right >>> 8) ^ left) & 0x00ff00ff; left ^= temp; right ^= (temp << 8);
        temp = ((left >>> 1) ^ right) & 0x55555555; right ^= temp; left ^= (temp << 1);
        //the right side needs to be shifted and to get the last four bits of the left side
        temp = (left << 8) | ((right >>> 20) & 0x000000f0);
        //left needs to be put upside down
        left = (right << 24) | ((right << 8) & 0xff0000) | ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0);
        right = temp;
        //now go through and perform these shifts on the left and right keys
        for (var i=0; i < shifts.length; i++) {
          //shift the keys either one or two bits to the left
          if (shifts[i]) {left = (left << 2) | (left >>> 26); right = (right << 2) | (right >>> 26);}
          else {left = (left << 1) | (left >>> 27); right = (right << 1) | (right >>> 27);}
          left &= -0xf; right &= -0xf;
          //now apply PC-2, in such a way that E is easier when encrypting or decrypting
          //this conversion will look like PC-2 except only the last 6 bits of each byte are used
          //rather than 48 consecutive bits and the order of lines will be according to
          //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7
          lefttemp = pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf]
            | pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf]
            | pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf]
            | pc2bytes6[(left >>> 4) & 0xf];
          righttemp = pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf]
            | pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf]
            | pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf]
            | pc2bytes13[(right >>> 4) & 0xf];
          temp = ((righttemp >>> 16) ^ lefttemp) & 0x0000ffff;
          keys[n++] = lefttemp ^ temp; keys[n++] = righttemp ^ (temp << 16);
        }
      } //for each iterations
      //return the keys we've created
      return keys;
    } //end of des_createKeys
    function genkey(key, start, end) {
      //8 byte / 64 bit Key (DES) or 192 bit Key
      return {key:pad(key.slice(start, end)),vector: 1};
    }
    function pad(key) {
      for (var i = key.length; i<24; i++) {
        key+="0";
      }
      return key;
    }
    var des3iv = '12345678';
    var DES3 = {
      //3DES加密,CBC/PKCS5Padding
      encrypt:function(key,input){
        var genKey = genkey(key, 0, 24);
        return btoa(des(genKey.key, input, 1, 1, des3iv, 1));
      },
      3DES解密,CBC/PKCS5Padding
      decrypt:function(key,input){
        var genKey = genkey(key, 0, 24); 
        return des(genKey.key, atob(input), 0, 1, des3iv, 1); 
      }
    };
    

     

    展开全文
  • 引用后可直接调用加密函数的C++代码 自行调整TDES_ENCRYPT_KEY、TDES_ENCRYPT_IV TDES_ENCRYPT_KEY 为Key, TDES_ENCRYPT_IV为偏移量(如不需要则设为空)
  • DES加密解密

    2021-04-15 18:31:34
    DES加密解密见代码 见代码 public static class DES{ /** * 加密 * @param key 密钥 * @param iv 向量 * @param data UTF8数据 * @return Base64密文 * @throws Exception */ public static String ...
  • python实现des加密

    千次阅读 2018-09-19 18:26:27
    最近跟别的公司对接一个系统,特们使用java写的,其中涉及到Des加密,两边需要得到相同的密文 from pyDes import * import base64 def DesEncrypt(self,st): # Des加密 Des_Key = "abcdefg" Des_IV...
  • DES加密 DES解密

    2016-10-24 15:32:00
    1 public static string _KEY = "HQDCKEY1"; //密钥 2 public static string _IV = "HQDCKEY2"; //向量 3 4 /// <summary> 5 /// DES加密 6 /// ...
  • DES加密

    2020-01-15 13:55:04
    java代码示例: /* * key : 密钥Key,key的长度必须大于等于 3*8 = 24 位哈 * iv : 初始化向量,增强随机... * cipherType : 实例化Cipher对象类型, "DESede/CBC/PKCS5Padding" 加密算法名称/分组加密模式/分...
  • des加密解密

    2019-10-25 15:31:59
    from pyDes import des, CBC, PAD_PKCS5 import binascii # 秘钥8位 KEY = 'ssbbssbb' def des_encrypt(s): ... DES 加密 :param s: 原始字符串 :return: 加密后字符串,16进制 """ secret_key = KEY iv...
  • des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 复制代码 代码如下: $iv_size = mcrypt_get_iv_...
  • python des加密

    2020-07-24 14:37:57
    import pyDes # 加密 def encrypt_str(data): ... method = pyDes.des(DES_SECRET_KEY, pyDes.CBC, IV, pad=None, padmode=pyDes.PAD_PKCS5) # 执行加密码 k = method.encrypt(data) # 转base64编码并返回 .
  • des加密

    2015-07-16 23:43:46
    define('DESKEY','13e998492ad888e695a431c68ac28178'); function encrypt($encrypt){ ... $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES,MCRYPT_MODE_ECB),MCRYPT_RAND);  $passcryp
  • c#des加密.zip

    2020-03-30 10:51:14
    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = des.CreateEncryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return BitConverter.ToString...
  • 之前我们已经学习过了PHP实现DES加密解密https://www.wj0511.com/site/detail.html?id=89 但是发现我在实现PHP实现DES加密解密时出现如下错误 Call to undefined function mcrypt_create_iv() 之后发现这是由于...
  • 3DES加密解密

    2019-06-11 15:10:40
    //3des加密 OPENSSL_RAW_DATA 为Pkcs7填充模式 static function des_encrypt($data,$key = ENCRYPT_KEY, $iv = ENCRYPT_IV) { $key = md5($key); //32位长度 $iv = substr(md5($iv),...
  • php des 加密解密实例

    2017-03-26 23:14:46
    des加密是对称加密中在互联网应用的比较多的一种加密方式,PHP 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 [php] view ...
  • When I read about the API, it stated that the data should be encrypted using MD5 and Triple Des Encryption, so I made some research about how to do it. <pre><code>// Here's the credentials to be ...
  • C# DES加密解密

    2020-04-23 16:36:21
    #region DES加密 private static byte[] key = ASCIIEncoding.ASCII.GetBytes(GetMacAddress()); private static byte[] iv = ASCIIEncoding.ASCII.GetBytes("99008855"); //判断当前运行环境 ...
  • 基于.net3.5,因此需要此环境才能运行。key和IV必须为8位,程序未对错误进行处理。(含源码)
  • PHP DES加密

    2019-09-15 11:28:57
    $key = "123456"; $encrypt="iohxqb"; $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB), MCRYPT_RAND); $decrypted = mcrypt_encr...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 385
精华内容 154
关键字:

des加密iv