`

Delphi, C#, Java 三者兼容的DES字节流加密/解密

 
阅读更多
来源:http://hi.baidu.com/spacetimer/item/65d5a13f4af069be124b1479
网络传数据时一般要经过加密, 较简单的DES对称加密(CRC模式,PKCS7)

==================================================================================
C#(客户端):

using System.Security.Cryptography;
...
/// <summary>
/// 进行DES加密。
/// </summary>
/// <param name="pToEncrypt">要加密的字节数组。</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>以Base64格式返回的加密字符串。</returns>
public static string Encrypt(byte[] bEncrypt, string sKey)
{
//return ToBase64(bEncrypt);

using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) //默认为crc,pkcs7
{
//byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
try
{
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(bEncrypt, 0, bEncrypt.Length);
cs.FlushFinalBlock();
cs.Close();
}
}
catch
{
return "";
}
string str = Convert.ToBase64String(ms.ToArray());
ms.Close();
return str;
}
}
注意这里直接用key当做VI向量,并且默认的padding策略为PKCS7

===================================================================================
Java Web服务端:


package com.spt.util;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
...

public class DESTool {

// 采用的是DES算法
private SecretKey secretKey;// 密钥
private IvParameterSpec iv;// 偏移量
private Cipher decryptCipher;// 解密对象

/*
* strKey必须是8位长度的字符串,即64bit。
*/
public DESTool(String strKey) {
try {
// 指定算法产生解密对象
decryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); //选择模式和填充方式,与.NET对应
// 由用户密钥产生系统密钥
secretKey = SecretKeyFactory.getInstance("DES").generateSecret(new DESKeySpec(strKey.getBytes("UTF-8")));
// 产生偏移量
iv = new IvParameterSpec(strKey.getBytes("UTF-8"));
// 加载解密对象
decryptCipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
}

/**
* 解密.net平台上C#加密过的字节数组
*
* @param arrB 待解密的字节数组
* @return 解密后的字节数组
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public byte[] decrypt(byte[] arrB) throws IllegalBlockSizeException, BadPaddingException {
return decryptCipher.doFinal(arrB);
}
}

==================================================================================
Delphi 客户端相应的DES加密
网上流传的一些des算法没有crc预处理和设置iv向量,因此为了上面的web服务端能够解密需要手工做些预处理

unit EncodingUtil;

interface

uses
SysUtils, Classes, Types, EncdDecd, LbCipher;

//输入首地址和长度、key串返回encrypted block
function DESEncrypt(pInData : PByte; dataLen : Integer; keyStr : string) : TByteDynArray;

implementation

function DESEncrypt(pInData : PByte; dataLen : Integer; keyStr : string) : TByteDynArray;
var
temp, res, byteStr, arrStr: string;
poschar : char;
Encrypt : boolean;
key : TKey64;
i, j, len, strLen, posnum, resLen, index : integer;
Context : TDESContext;
block, iv: TDESBlock;
lastByte, curByte : Byte;
begin
resLen := dataLen + 1;
if resLen mod 8 <> 0 then
resLen := resLen + (8 - (resLen mod);
SetLength(Result, resLen);
index := 0;

Encrypt := true;
strLen := Length(keyStr);

//iv也默认和key一样
for i:=0 to 7 do
begin
if i > (strLen-1) then
begin
key[i] := 0;
iv[i]:= 0
end
else
begin
key[i] := byte(keyStr[i+1]);
iv[i] := key[i];
end;
end;

InitEncryptDES(Key, Context, Encrypt);
len := dataLen;
lastByte := Byte(8 - (dataLen mod);

posnum := 0;
for i:=0 to len do
begin
if (i = len) then
curByte := lastByte
else
curByte := (PByte(longint(pInData) + i))^;
block[posnum] := curByte;
posnum := posnum +1;
if posnum = 8 then
begin
EncryptDESCBC(Context, IV, block);   //block modified
for j:= 0 to 7 do
begin
Result[index] := block[j];
index := index + 1;
end;
iv := block;
posnum := 0;
end;
end;

if  posnum <> 0 then
begin
for i := posnum to 7 do
begin
block[i] := lastByte;
end;
EncryptDESCBC(Context, IV, Block);
for j:= 0 to 7 do
begin
Result[index] := block[j];
index := index + 1;
end;
posnum := 0;
end;

{
if index <> resLen then
ShowMessage('des error');
}

end;

end.


参考 http://www.unpack.cn/thread-35739-1-1.html
http://www.cnblogs.com/enli/archive/2008/07/10/1240144.html
PB Lock Box下载:http://sourceforge.net/projects/tplockbox
安装:D7 source, lib路径加入控件source, 安装package vc70.dpk
分享到:
评论

相关推荐

    delphi与java 加密解密 DES/CBC/PKCS5Padding

    最近做一个接口,与JAVA的关于DES/CBC/PKCS5Padding 互相解密。在网上找了很多资料,摸索了3天才摸索出来。同样的明文,用JAVA加密的密文死活都跟用DELPHI加密的不相等,有时候少于8个字符的就正常,多了8个字符的就...

    Delphi7与C#实现Des加解密互通Demo,全网找遍只次一份

    标题中的“Delphi7与C#实现Des加解密互通Demo”指的是一个示例项目,该项目旨在演示如何在Delphi 7和C#之间进行DES加密和解密操作,确保两个环境下的数据一致性。全网找遍只此一份,表明这个示例可能比较罕见且具有...

    AES加密/解密,C,java,delphi互解

    在标题中提到的"C, java, delphi互解"意味着这个压缩包内包含了用C、Java和Delphi三种编程语言实现的AES加密和解密功能,而且这些实现可以相互兼容,这意味着无论你在哪个平台上或使用哪种语言,都能对加密的数据...

    用delphi写的一个des的加密解密小程序,java写的des的一个类

    标题中的“用Delphi写的一个DES的加密解密小程序,Java写的DES的一个类”表明了这个压缩包包含两个部分:一个是使用Delphi编程语言编写的用于执行DES(Data Encryption Standard)加密和解密的小程序,另一个是用Java...

    DES加密_delphi_加解密_des_

    在Delphi中实现DES加密通常需要调用低级的Pascal函数或使用第三方库如DCPCrypt等。 3. **源码实现**:描述中提到的"源码"是指用于在Delphi中实现DES加密和解密的具体代码。这些源码可能包括创建密钥、初始化加密和...

    java与delphi 通用 DES加解密(源代码)

    本文将深入探讨Java和Delphi中实现DES加解密的源代码,以及如何实现这两个不同平台之间的互操作性。 DES算法是在1970年代由IBM开发,后来被美国国家标准局(NIST)采纳为标准。它基于64位的数据块进行操作,使用56...

    Delphi DES 加密解密

    Delphi DES 加密解密是Delphi编程环境中应用DES(Data Encryption Standard)算法进行数据安全处理的一种技术。DES是一种块密码,由IBM在1970年代初开发,并在1977年由美国国家标准局(NIST)采纳为联邦信息处理标准...

    Delphi10.2 DES/CBC/PKCS5Padding/UTF-8

    描述中提到,这个程序是基于与Java版本的互操作性需求而修改的,确保了与Java实现的DES/CBC/PKCS5Padding解密过程兼容,并且能够正确处理UTF-8编码的中文字符,这意味着它能与在线加密网站的结果保持一致。...

    加密解密.rar_DELPHI XE10 DES_DFM加密码_Dephi DesEncry_delphi 加密 解密_del

    在Delphi XE10开发环境中,涉及到的加密解密技术主要是DES(Data Encryption Standard)算法,这是一种广泛使用的对称加密算法。本压缩包提供的资料是关于如何在Delphi程序中实现DES加密和解密的实例。下面我们将...

    DES加密/解密 BCB XE2 可直接加入程序使用

    在这个项目中,“DES加密/解密 BCB XE2 可直接加入程序使用”提供了在Borland C++ Builder XE2 (BCB XE2)平台上实现DES加密和解密功能的代码资源。Borland C++ Builder是一个集成开发环境(IDE),用于编写C++应用,...

    Delphi Lazarus C实现的DES、3DES加密解密

    Delphi、Lazarus、C语言实现DES、3DES对称加密解密模块,支持单倍长和双倍长密钥。

    Java C# Delphi语言AES加解密兼容方案

    本方案主要探讨了如何实现Java、C#和Delphi这三种不同编程语言之间的AES加解密兼容性,确保在不同平台和环境中数据的互操作性。 AES-128-ECB是一种常见的AES加密模式,它使用128位的密钥,并且在加密过程中不考虑...

    Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes

    本资源"Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes"提供的是在Delphi编程环境中实现AES加密和解密的示例代码,其目标是与Java平台上的加解密过程保持兼容。 首先,让我们深入了解一下...

    delphi,java des算法通用加解密源码

    标题中的"delphi,java des算法通用加解密源码"指的是使用DES(Data Encryption Standard)算法实现的加密和解密功能,适用于两种不同的编程语言:Delphi和Java。DES是一种广泛使用的对称加密算法,它基于块密码设计...

    delphi7 加解密DES

    在Delphi7这个经典的面向对象的编程环境中,开发人员可以利用其强大的VCL库来实现DES的加解密功能。本文将深入探讨如何在Delphi7中实现DES加解密,并提供相关知识点。 首先,了解DES算法的基本原理。DES是一种块...

    Delphi与Java互通3Des加解密类(XE2)

    "3DES调用.txt"可能包含了一些示例或者说明,指导用户如何在Java和Delphi之间正确地调用3DES加密和解密的代码,包括设置相同的密钥、初始化向量(IV,虽然在ECB模式下不需要)等步骤。在实际应用中,确保两端使用的...

    delphi7 AES 加密兼容Java

    为了使Delphi和Java之间实现AES加解密的兼容,关键在于保持相同的密钥、加密模式(ECB、CBC等)、填充方式(PKCS5Padding等)以及IV。在两个环境中生成相同的密钥和IV,保证相同的加密参数,这样加密后的数据在解密...

    Delphi ,Java,php等通用 RSA加密,解密,签名.

    本知识点将深入探讨RSA算法的原理、实现过程以及如何在Delphi、Java和PHP这三种不同的编程环境中进行加密、解密和签名操作。 **RSA算法原理:** RSA是由Ron Rivest、Adi Shamir和Leonard Adleman三位科学家在1977年...

Global site tag (gtag.js) - Google Analytics