AES For Delphi And Java, AES/ECB/PKCS5Padding(二)

上一篇文章里面,AES加密算法测试用的加密密钥是1234567812345678,正好是128bit的,如果密钥不是128bit呢,该怎么填充?

先看以下代码:

[java]  view plain  copy
  1. package encryption;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4. import java.security.InvalidKeyException;  
  5. import java.security.NoSuchAlgorithmException;  
  6. import java.security.SecureRandom;  
  7.   
  8. import javax.crypto.BadPaddingException;  
  9. import javax.crypto.Cipher;  
  10. import javax.crypto.IllegalBlockSizeException;  
  11. import javax.crypto.KeyGenerator;  
  12. import javax.crypto.NoSuchPaddingException;  
  13. import javax.crypto.SecretKey;  
  14. import javax.crypto.spec.SecretKeySpec;  
  15.   
  16. public class AESTest {  
  17.     public static void main(String args[]){  
  18.         String content = "test";  
  19.         String password = "12345678";  
  20.         //加密  
  21.         System.out.println("加密前:" + content);  
  22.         byte[] encryptResult = encrypt(content, password);  
  23.         System.out.println("加密后:" + parseByte2HexStr(encryptResult));  
  24.         //解密  
  25.         byte[] decryptResult = decrypt(encryptResult,password);  
  26.         System.out.println("解密后:" + new String(decryptResult));  
  27.     }  
  28.       
  29.     /** 
  30.      * 加密 
  31.      *  
  32.      * @param content 需要加密的内容 
  33.      * @param password  加密密码 
  34.      * @return 
  35.      */  
  36.     public static byte[] encrypt(String content, String password) {  
  37.             try {             
  38.                     KeyGenerator kgen = KeyGenerator.getInstance("AES");  
  39.                     kgen.init(128new SecureRandom(password.getBytes()));  
  40.                     SecretKey secretKey = kgen.generateKey();  
  41.                     byte[] enCodeFormat = secretKey.getEncoded();  
  42.                     SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");  
  43.                     Cipher cipher = Cipher.getInstance("AES");// 创建密码器  
  44.                     byte[] byteContent = content.getBytes("utf-8");  
  45.                     cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化  
  46.                     byte[] result = cipher.doFinal(byteContent);  
  47.                     return result; // 加密  
  48.             } catch (NoSuchAlgorithmException e) {  
  49.                     e.printStackTrace();  
  50.             } catch (NoSuchPaddingException e) {  
  51.                     e.printStackTrace();  
  52.             } catch (InvalidKeyException e) {  
  53.                     e.printStackTrace();  
  54.             } catch (UnsupportedEncodingException e) {  
  55.                     e.printStackTrace();  
  56.             } catch (IllegalBlockSizeException e) {  
  57.                     e.printStackTrace();  
  58.             } catch (BadPaddingException e) {  
  59.                     e.printStackTrace();  
  60.             }  
  61.             return null;  
  62.     }  
  63.       
  64.     /**解密 
  65.      * @param content  待解密内容 
  66.      * @param password 解密密钥 
  67.      * @return 
  68.      */  
  69.     public static byte[] decrypt(byte[] content, String password) {  
  70.             try {  
  71.                      KeyGenerator kgen = KeyGenerator.getInstance("AES");  
  72.                      kgen.init(128new SecureRandom(password.getBytes()));  
  73.                      SecretKey secretKey = kgen.generateKey();  
  74.                      byte[] enCodeFormat = secretKey.getEncoded();  
  75.                      SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");              
  76.                      Cipher cipher = Cipher.getInstance("AES");// 创建密码器  
  77.                     cipher.init(Cipher.DECRYPT_MODE, key);// 初始化  
  78.                     byte[] result = cipher.doFinal(content);  
  79.                     return result; // 加密  
  80.             } catch (NoSuchAlgorithmException e) {  
  81.                     e.printStackTrace();  
  82.             } catch (NoSuchPaddingException e) {  
  83.                     e.printStackTrace();  
  84.             } catch (InvalidKeyException e) {  
  85.                     e.printStackTrace();  
  86.             } catch (IllegalBlockSizeException e) {  
  87.                     e.printStackTrace();  
  88.             } catch (BadPaddingException e) {  
  89.                     e.printStackTrace();  
  90.             }  
  91.             return null;  
  92.     }  
  93.       
  94.     /**将二进制转换成16进制 
  95.      * @param buf 
  96.      * @return 
  97.      */  
  98.     public static String parseByte2HexStr(byte buf[]) {  
  99.             StringBuffer sb = new StringBuffer();  
  100.             for (int i = 0; i < buf.length; i++) {  
  101.                     String hex = Integer.toHexString(buf[i] & 0xFF);  
  102.                     if (hex.length() == 1) {  
  103.                             hex = '0' + hex;  
  104.                     }  
  105.                     sb.append(hex.toUpperCase());  
  106.             }  
  107.             return sb.toString();  
  108.     }  
  109.       
  110.     /**将16进制转换为二进制 
  111.      * @param hexStr 
  112.      * @return 
  113.      */  
  114.     public static byte[] parseHexStr2Byte(String hexStr) {  
  115.             if (hexStr.length() < 1)  
  116.                     return null;  
  117.             byte[] result = new byte[hexStr.length()/2];  
  118.             for (int i = 0;i< hexStr.length()/2; i++) {  
  119.                     int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);  
  120.                     int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  
  121.                     result[i] = (byte) (high * 16 + low);  
  122.             }  
  123.             return result;  
  124.     }  
  125. }  
这个代码里面,输入的“密钥”是12345678,依然还能加密和解密成功

12345678只有64位,AES的密钥不是最低要求128位吗,为什么依旧能加密功能呢?

原因就出在下面这段代码上:

[java]  view plain  copy
  1. KeyGenerator kgen = KeyGenerator.getInstance("AES");  
  2. kgen.init(128new SecureRandom(password.getBytes()));  
  3. SecretKey secretKey = kgen.generateKey();  
  4. byte[] enCodeFormat = secretKey.getEncoded();  
java里面每个加密算法都有一个keyGenerator ,里面主要是用来生成随机密钥的。

别的算法没有研究过,AES算法中SecureRandom使用的算法是SHA1PRNG

[java]  view plain  copy
  1.        System.out.println("KeyGenerator 结果:");  
  2.        try {  
  3.         KeyGenerator kgen = KeyGenerator.getInstance("AES");  
  4.         kgen.init(128new SecureRandom(password.getBytes()));  
  5.         SecretKey secretKey = kgen.generateKey();  
  6.         byte[] enCodeFormat = secretKey.getEncoded();  
  7.         for (int i = 0; i < enCodeFormat.length; i++) {  
  8.             System.out.print(" "+enCodeFormat[i]);  
  9.         }             
  10.     } catch (NoSuchAlgorithmException e) {  
  11.         // TODO Auto-generated catch block  
  12.         e.printStackTrace();  
  13.     }  
  14. System.out.println();  
  15. System.out.println("SecureRandom 结果:");  
  16. try {  
  17.         SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");  
  18.         sr.setSeed(password.getBytes());  
  19.         byte[] keyByte = new byte[16];  
  20.         sr.nextBytes(keyByte);  
  21.         for (int i = 0; i < keyByte.length; i++) {  
  22.             System.out.print(" "+keyByte[i]);  
  23.         }  
  24.     } catch (NoSuchAlgorithmException e) {  
  25.         // TODO Auto-generated catch block  
  26.         e.printStackTrace();  
  27.     }  
输出结果如下:

[java]  view plain  copy
  1. KeyGenerator 结果:  
  2.  -47 6 101 -53 -53 -88 -29 -12 68 -93 -1 -77 22 -102 87 23  
  3. SecureRandom 结果:  
  4.  -47 6 101 -53 -53 -88 -29 -12 68 -93 -1 -77 22 -102 87 23  

这说明AES就是调用了SecureRandom的nextBytes方法来实现密钥填充的。

用Delphi来实现SecureRandom,太过复杂,也没有必要,我们只要保证加密的时候密钥填充方式一致,加密的结果肯定也会一样的。

于是,Delphi和Java的密钥填充就都定为密钥不够就补零。

网上还有一些人说加密解密中文出现乱码,这个应该注意加密和解密的编码格式,我电脑上面java文件的编码格式是GBK,Delphi的版本是Delphi7,编码格式也是GBK,这样就没有中文乱码问题了。

java和Delphi通用的加密和解密,代码下载地址:http://download.csdn.net/detail/kunlun122/7539147

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近做一个接口,与JAVA的关于DES/CBC/PKCS5Padding 互相解密。在网上找了很多资料,摸索了3天才摸索出来。同样的明文,用JAVA加密的密文死活都跟用DELPHI加密的不相等,有时候少于8个字符的就正常,多了8个字符的就有问题,原来是有个7把7改成8就可以了。害人啊,, function EncryDes(const str:string;const keystr:string;const ivstr:string):string ; var key:tkey64; Context:TDESContext; Block,iv:TDESBlock; i,j,len,posnum:smallint; poschar,xx:char; xuhuan:integer; begin for i:=0 to 7 do begin if i > (length(keystr)-1) then key[i] :=0 else key[i] := byte(keystr[i+1]); end; for i:=0 to 7 do begin if i > (length(ivstr)-1) then iv[i]:=0 else iv[i] := byte(ivstr[i+1]); end; InitEncryptDES(Key, Context, true); len := length(AnsiString(str)); xx:= char( 8- (len mod 8)); if len<=8 then xuhuan:=0 else xuhuan:=round(len/8); for i:=0 to xuhuan do begin for j:=0 to 7 do begin if ((i*8+j+1)<=len) then //关键这一步,网上好多参考资料都是((i*7+j+1)<=len),而不是((i*8+j+1)<=len) 害人啊,害得我摸索了3天,,哎 begin poschar:=str[i*8+j+1]; block[j]:=byte(poschar); end else block[j]:=byte(xx); end; EncryptDESCBC(Context, IV, Block); for j:= 0 to 7 do begin posnum:=block[j]; result := result + inttohex(posnum,2); end; iv:=block; end; end; //完整代码如下 unit dmdes; {*********************************************************} {* DELPHI、PHP、C#通用DES编码解码单元 *} {* 由TurboPower LockBox部分代码改写 *} {* 滕州市东鸣软件工作室制作 ZWF 2011-12-27 *} {*********************************************************} {EncryDes为编码函数,DecryDes为解码函数,keystr为密码,ivstr为偏移量, 一般设置keystr,ivstr相同,内容为八位字节长度的字符串,编码结果为十六进制字串} interface uses Windows,SysUtils; type PKey64 = ^TKey64; TKey64 = array [0..7] of Byte; type TDESBlock = array[0..7] of Byte; TDESContext = packed record TransformedKey : array [0..31] of LongInt; Encrypt : Boolean; end; function EncryDes(const str:string;const keystr:string;const ivstr:string):string ; function DecryDes(const str:string;const keystr:string;const ivstr:string):string ; function DecryDessec(const str:string;const keystr:string;const ivstr:string):string ; implementation procedure XorMemPrim(var Mem1; const Mem2; Count : Cardinal); register; asm push esi push edi mov esi, eax //esi = Mem1 mov edi, edx //edi = Mem2 push ecx //save byte count shr ecx, 2 //convert to dwords jz @Continue cld @Loop1: //xor dwords at a time mov eax, [edi] xor [esi], eax add esi, 4 add edi, 4 dec ecx jnz @Loop1 @Continue: //handle remaining bytes (3 or less) pop ecx and ecx, 3 jz @Done @Loop2: //xor remaining bytes mov al, [edi] xor [esi], al inc esi inc edi dec ecx jnz @Loop2 @Done: pop edi pop esi end; { -------------------------------------------------------------------------- } procedure XorMem(var Mem1; const Mem2; Count : Cardinal); begin XorMemPrim(Mem1, Mem2, Count); end; { -------------------------------------------------------------------------- } procedure EncryptDES(const Context : TDESContext; var Block : TDESBlock); const SPBox : array [0..7, 0..63] of DWord = (($01010400, $00000000, $00010000, $01010404, $01010004, $00010404, $00000004, $00010000, $00000400, $01010400, $01010404, $00000400, $01000404, $01010004, $01000000, $00000004, $00000404, $01000400, $01000400, $00010400, $00010400, $01010000, $01010000, $01000404, $00010004, $01000004, $01000004, $00010004, $00000000, $00000404, $00010404, $01000000, $00010000, $01010404, $00000004, $01010000, $01010400, $01000000, $01000000, $00000400, $01010004, $00010000, $00010400, $01000004, $00000400, $00000004, $01000404, $00010404, $01010404, $00010004, $01010000, $01000404, $01000004, $00000404, $00010404, $01010400, $00000404, $01000400, $01000400, $00000000, $00010004, $00010400, $00000000, $01010004), ($80108020, $80008000, $00008000, $00108020, $00100000, $00000020, $80100020, $80008020, $80000020, $80108020, $80108000, $80000000, $80008000, $00100000, $00000020, $80100020, $00108000, $00100020, $80008020, $00000000, $80000000, $00008000, $00108020, $80100000, $00100020, $80000020, $00000000, $00108000, $00008020, $80108000, $80100000, $00008020, $00000000, $00108020, $80100020, $00100000, $80008020, $80100000, $80108000, $00008000, $80100000, $80008000, $00000020, $80108020, $00108020, $00000020, $00008000, $80000000, $00008020, $80108000, $00100000, $80000020, $00100020, $80008020, $80000020, $00100020, $00108000, $00000000, $80008000, $00008020, $80000000, $80100020, $80108020, $00108000), ($00000208, $08020200, $00000000, $08020008, $08000200, $00000000, $00020208, $08000200, $00020008, $08000008, $08000008, $00020000, $08020208, $00020008, $08020000, $00000208, $08000000, $00000008, $08020200, $00000200, $00020200, $08020000, $08020008, $00020208, $08000208, $00020200, $00020000, $08000208, $00000008, $08020208, $00000200, $08000000, $08020200, $08000000, $00020008, $00000208, $00020000, $08020200, $08000200, $00000000, $00000200, $00020008, $08020208, $08000200, $08000008, $00000200, $00000000, $08020008, $08000208, $00020000, $08000000, $08020208, $00000008, $00020208, $00020200, $08000008, $08020000, $08000208, $00000208, $08020000, $00020208, $00000008, $08020008, $00020200), ($00802001, $00002081, $00002081, $00000080, $00802080, $00800081, $00800001, $00002001, $00000000, $00802000, $00802000, $00802081, $00000081, $00000000, $00800080, $00800001, $00000001, $00002000, $00800000, $00802001, $00000080, $00800000, $00002001, $00002080, $00800081, $00000001, $00002080, $00800080, $00002000, $00802080, $00802081, $00000081, $00800080, $00800001, $00802000, $00802081, $00000081, $00000000, $00000000, $00802000, $00002080, $00800080, $00800081, $00000001, $00802001, $00002081, $00002081, $00000080, $00802081, $00000081, $00000001, $00002000, $00800001, $00002001, $00802080, $00800081, $00002001, $00002080, $00800000, $00802001, $00000080, $00800000, $00002000, $00802080), ($00000100, $02080100, $02080000, $42000100, $00080000, $00000100, $40000000, $02080000, $40080100, $00080000, $02000100, $40080100, $42000100, $42080000, $00080100, $40000000, $02000000, $40080000, $40080000, $00000000, $40000100, $42080100, $42080100, $02000100, $42080000, $40000100, $00000000, $42000000, $02080100, $02000000, $42000000, $00080100, $00080000, $42000100, $00000100, $02000000, $40000000, $02080000, $42000100, $40080100, $02000100, $40000000, $42080000, $02080100, $40080100, $00000100, $02000000, $42080000, $42080100, $00080100, $42000000, $42080100, $02080000, $00000000, $40080000, $42000000, $00080100, $02000100, $40000100, $00080000, $00000000, $40080000, $02080100, $40000100), ($20000010, $20400000, $00004000, $20404010, $20400000, $00000010, $20404010, $00400000, $20004000, $00404010, $00400000, $20000010, $00400010, $20004000, $20000000, $00004010, $00000000, $00400010, $20004010, $00004000, $00404000, $20004010, $00000010, $20400010, $20400010, $00000000, $00404010, $20404000, $00004010, $00404000, $20404000, $20000000, $20004000, $00000010, $20400010, $00404000, $20404010, $00400000, $00004010, $20000010, $00400000, $20004000, $20000000, $00004010, $20000010, $20404010, $00404000, $20400000, $00404010, $20404000, $00000000, $20400010, $00000010, $00004000, $20400000, $00404010, $00004000, $00400010, $20004010, $00000000, $20404000, $20000000, $00400010, $20004010), ($00200000, $04200002, $04000802, $00000000, $00000800, $04000802, $00200802, $04200800, $04200802, $00200000, $00000000, $04000002, $00000002, $04000000, $04200002, $00000802, $04000800, $00200802, $00200002, $04000800, $04000002, $04200000, $04200800, $00200002, $04200000, $00000800, $00000802, $04200802, $00200800, $00000002, $04000000, $00200800, $04000000, $00200800, $00200000, $04000802, $04000802, $04200002, $04200002, $00000002, $00200002, $04000000, $04000800, $00200000, $04200800, $00000802, $00200802, $04200800, $00000802, $04000002, $04200802, $04200000, $00200800, $00000000, $00000002, $04200802, $00000000, $00200802, $04200000, $00000800, $04000002, $04000800, $00000800, $00200002), ($10001040, $00001000, $00040000, $10041040, $10000000, $10001040, $00000040, $10000000, $00040040, $10040000, $10041040, $00041000, $10041000, $00041040, $00001000, $00000040, $10040000, $10000040, $10001000, $00001040, $00041000, $00040040, $10040040, $10041000, $00001040, $00000000, $00000000, $10040040, $10000040, $10001000, $00041040, $00040000, $00041040, $00040000, $10041000, $00001000, $00000040, $10040040, $00001000, $00041040, $10001000, $00000040, $10000040, $10040000, $10040040, $10000000, $00040000, $10001040, $00000000, $10041040, $00040040, $10000040, $10040000, $10001000, $10001040, $00000000, $10041040, $00041000, $00041000, $00001040, $00001040, $00040040, $10000000, $10041000)); var I, L, R, Work : DWord; CPtr : PDWord; procedure SplitBlock(const Block : TDESBlock; var L, R : DWord); register; asm push ebx push eax mov eax, [eax] mov bh, al mov bl, ah rol ebx, 16 shr eax, 16 mov bh, al mov bl, ah mov [edx], ebx pop eax mov eax, [eax+4] mov bh, al mov bl, ah rol ebx, 16 shr eax, 16 mov bh, al mov bl, ah mov [ecx], ebx pop ebx end; procedure JoinBlock(const L, R : LongInt; var Block : TDESBlock); register; asm push ebx mov bh, al mov bl, ah rol ebx, 16 shr eax, 16 mov bh, al mov bl, ah mov [ecx+4], ebx mov bh, dl mov bl, dh rol ebx, 16 shr edx, 16 mov bh, dl mov bl, dh mov [ecx], ebx pop ebx end; procedure IPerm(var L, R : DWord); var Work : DWord; begin Work := ((L shr 4) xor R) and $0F0F0F0F; R := R xor Work; L := L xor Work shl 4; Work := ((L shr 16) xor R) and $0000FFFF; R := R xor Work; L := L xor Work shl 16; Work := ((R shr 2) xor L) and $33333333; L := L xor Work; R := R xor Work shl 2; Work := ((R shr 8) xor L) and $00FF00FF; L := L xor Work; R := R xor Work shl 8; R := (R shl 1) or (R shr 31); Work := (L xor R) and $AAAAAAAA; L := L xor Work; R := R xor Work; L := (L shl 1) or (L shr 31); end; procedure FPerm(var L, R : DWord); var Work : DWord; begin L := L; R := (R shl 31) or (R shr 1); Work := (L xor R) and $AAAAAAAA; L := L xor Work; R := R xor Work; L := (L shr 1) or (L shl 31); Work := ((L shr 8) xor R) and $00FF00FF; R := R xor Work; L := L xor Work shl 8; Work := ((L shr 2) xor R) and $33333333; R := R xor Work; L := L xor Work shl 2; Work := ((R shr 16) xor L) and $0000FFFF; L := L xor Work; R := R xor Work shl 16; Work := ((R shr 4) xor L) and $0F0F0F0F; L := L xor Work; R := R xor Work shl 4; end; begin SplitBlock(Block, L, R); IPerm(L, R); CPtr := @Context; for I := 0 to 7 do begin Work := (((R shr 4) or (R shl 28)) xor CPtr^); Inc(CPtr); L := L xor SPBox[6, Work and $3F]; L := L xor SPBox[4, Work shr 8 and $3F]; L := L xor SPBox[2, Work shr 16 and $3F]; L := L xor SPBox[0, Work shr 24 and $3F]; Work := (R xor CPtr^); Inc(CPtr); L := L xor SPBox[7, Work and $3F]; L := L xor SPBox[5, Work shr 8 and $3F]; L := L xor SPBox[3, Work shr 16 and $3F]; L := L xor SPBox[1, Work shr 24 and $3F]; Work := (((L shr 4) or (L shl 28)) xor CPtr^); Inc(CPtr); R := R xor SPBox[6, Work and $3F]; R := R xor SPBox[4, Work shr 8 and $3F]; R := R xor SPBox[2, Work shr 16 and $3F]; R := R xor SPBox[0, Work shr 24 and $3F]; Work := (L xor CPtr^); Inc(CPtr); R := R xor SPBox[7, Work and $3F]; R := R xor SPBox[5, Work shr 8 and $3F]; R := R xor SPBox[3, Work shr 16 and $3F]; R := R xor SPBox[1, Work shr 24 and $3F]; end; FPerm(L, R); JoinBlock(L, R, Block); end; procedure InitEncryptDES(const Key : TKey64; var Context : TDESContext; Encrypt : Boolean); const PC1 : array [0..55] of Byte = (56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3); PC2 : array [0..47] of Byte = (13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31); CTotRot : array [0..15] of Byte = (1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28); CBitMask : array [0..7] of Byte = (128, 64, 32, 16, 8, 4, 2, 1); var PC1M : array [0..55] of Byte; PC1R : array [0..55] of Byte; KS : array [0..7] of Byte; I, J, L, M : LongInt; begin {convert PC1 to bits of key} for J := 0 to 55 do begin L := PC1[J]; M := L mod 8; PC1M[J] := Ord((Key[L div 8] and CBitMask[M]) 0); end; {key chunk for each iteration} for I := 0 to 15 do begin {rotate PC1 the right amount} for J := 0 to 27 do begin L := J + CTotRot[I]; if (L (length(keystr)-1) then key[i] :=0 else key[i] := byte(keystr[i+1]); end; for i:=0 to 7 do begin if i > (length(ivstr)-1) then iv[i]:=0 else iv[i] := byte(ivstr[i+1]); end; InitEncryptDES(Key, Context, true); len := length(AnsiString(str)); xx:= char( 8- (len mod 8)); if len<=8 then xuhuan:=0 else xuhuan:=round(len/8); for i:=0 to xuhuan do begin for j:=0 to 7 do begin if ((i*8+j+1) (length(temp)-1) then key[i] :=0 else key[i] := byte(temp[i+1]); end; temp := ivstr; for i:=0 to 7 do begin if i > (length(temp)-1) then iv[i] := 0 else iv[i] := byte(temp[i+1]); end; InitEncryptDES(Key, Context, False); temp := str; posnum := 0; for i:=0 to length(temp)-1 do begin Block[posnum] := byte(temp[i+1]); posnum := posnum+1; if posnum = 8 then begin bak := block; EncryptDESCBC(Context, IV, Block); for j:= 0 to 7 do begin // temp := temp+inttostr(byte(block[i]))+' '; res := res + char(block[j]); end; iv := bak; posnum := 0; end; end; if posnum 0 then begin // end else begin temp:=''; for i:= 1 to length(res) do begin temp := temp+char(res[i]); end; Result:= trim(temp); end; end; function DecryDes(const str:string;const keystr:string;const ivstr:string):string ; var key:tkey64; Context:TDESContext; bak,Block,iv:TDESBlock; i,j,len,posnum:smallint; poschar,xx:char; res,lss:string; begin for i:=0 to 7 do begin if i > (length(keystr)-1) then key[i] :=0 else key[i] := byte(keystr[i+1]); end; for i:=0 to 15 do begin if i > (length(ivstr)-1) then iv[i]:=0 else iv[i] := byte(ivstr[i+1]); end; InitEncryptDES(Key, Context, false); res:=''; for j:= 0 to (length(str) div 2)-1 do begin lss:=copy(str,j*2+1,2); res:=res+ char(StrToInt('$'+lss)) ; end; len := length(AnsiString(res)); for i:=0 to round(len/8)-1 do begin for j:=0 to 7 do begin if ((i*7+j+1)<=len) then begin poschar:=res[i*8+j+1]; block[j]:=byte(poschar); end else begin block[j]:=byte(xx); end; end; bak:=block; EncryptDESCBC(Context, IV, Block); for j:= 0 to 7 do begin result := result + char(block[j]); end; iv:=bak; end; end; end.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值