java的 DES 加密解密方法 求对应php的加密解密方法 急切(des加密例子)

2023-03-06 8:23:50 密码用途 思思

DES是一种标准的数据加密算法,关于这个算法的详细介绍可以参考wiki和百度百科:

php中有一个扩展可以支持DES的加密算法,是:extension=php_mcrypt.dll

在配置文件中将这个扩展打开还不能够在windows环境下使用

需要将PHP文件夹下的 libmcrypt.dll 拷贝到系统的 system32 目录下,这是通过phpinfo可以查看到mcrypt表示这个模块可以正常试用了。

下面是PHP中使用DES加密解密的一个例子:

    //$input - stuff to decrypt

    //$key - the secret key to use

    function do_mencrypt($input, $key)

    {

        $input = str_replace(""n", "", $input);

        $input = str_replace(""t", "", $input);

        $input = str_replace(""r", "", $input);

        $key = substr(md5($key), 0, 24);

        $td = mcrypt_module_open('tripledes', '', 'ecb', '');

        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

        mcrypt_generic_init($td, $key, $iv);

        $encrypted_data = mcrypt_generic($td, $input);

        mcrypt_generic_deinit($td);

        mcrypt_module_close($td);

        return trim(chop(base64_encode($encrypted_data)));

    }

    //$input - stuff to decrypt

    //$key - the secret key to use

    

    function do_mdecrypt($input, $key)

    {

        $input = str_replace(""n", "", $input);

        $input = str_replace(""t", "", $input);

        $input = str_replace(""r", "", $input);

        $input = trim(chop(base64_decode($input)));

        $td = mcrypt_module_open('tripledes', '', 'ecb', '');

        $key = substr(md5($key), 0, 24);

        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

        mcrypt_generic_init($td, $key, $iv);

        $decrypted_data = mdecrypt_generic($td, $input);

        mcrypt_generic_deinit($td);

        mcrypt_module_close($td);

        return trim(chop($decrypted_data));

    }

参考自:

des加密算法

des加密算法如下:

一、DES加密算法简介

DES(Data Encryption Standard)是目前最为流行的加密算法之一。DES是对称的,也就是说它使用同一个密钥来加密和解密数据。

DES还是一种分组加密算法,该算法每次处理固定长度的数据段,称之为分组。DES分组的大小是64位,如果加密的数据长度不是64位的倍数,可以按照某种具体的规则来填充位。

从本质上来说,DES的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混乱和扩散”的原则。混乱的目的是为隐藏任何明文同密文、或者密钥之间的关系,而扩散的目的是使明文中的有效位和密钥一起组成尽可能多的密文。两者结合到一起就使得安全性变得相对较高。

DES算法具体通过对明文进行一系列的排列和替换操作来将其加密。过程的关键就是从给定的初始密钥中得到16个子密钥的函数。要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复16次。每一次迭代称之为一轮。要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。

二、DES加密算法加密原理

DES是采用分组加密。使用64位的分组长度和56位的密钥长度,将64位的输入经过一系列变换得到64位的输出。DES算法利用多次组合替代算法和换位算法,通过混淆和扩散的相互作用,把明文编辑成密码强度很高的密文。解密则使用了相同的步骤和相同的密钥。

64位数据为一组进行加密;

初始置换根据一张8*8的置换表,将64位的明文打乱

与56位的密钥经16轮次迭代运算形成的初始密文

最后经过初始逆置换得到分组的最终密文

DES加密算法的测试数据示例

其实你只要再写个解密的过程看看加密完能不能还原回去就好了。。解密过程和加密过程基本一样,就是使用子密钥时的顺序是倒着的。

明文是 testdata,密钥是mydeskey 正确的des加密后二进制密文:1110001100001100101001110100000011101100110000110110101000100000

用base64编码形成的密文是:4wynQOzDaiA=

解密后:0111010001100101011100110111010001100100011000010111010001100001

求一简单的 DES加密实例。要c#.net实现!

public class DESEncrypt

{

private string _iv = "12345678";

private string _key = "acfeffsd";

private DES _des = new DESCryptoServiceProvider();

private Encoding _encoding = Encoding.Unicode;

/// summary

///

/// /summary

/// valueThe encrypty key./value

public string EncryptyKey

{

set { _key = value; }

get { return _key; }

}

/// summary

///

/// /summary

/// valueThe encoding mode./value

public Encoding EncodingMode

{

set { _encoding = value; }

get { return _encoding; }

}

/// summary

/// Encrypt

/// /summary

/// param name="str"The STR./param

/// returns/returns

public string Encrypt(string str)

{

var ivb = Encoding.ASCII.GetBytes(_iv);

var keyb = Encoding.ASCII.GetBytes(EncryptyKey);

var tob = EncodingMode.GetBytes(str);

byte[] encrypted;

var encryptor = _des.CreateEncryptor(keyb, ivb);

var msEncrypt = new MemoryStream();

var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

csEncrypt.Write(tob, 0, tob.Length);

csEncrypt.FlushFinalBlock();

encrypted = msEncrypt.ToArray();

csEncrypt.Close();

msEncrypt.Close();

return EncodingMode.GetString(encrypted);

}

/// summary

/// Decript

/// /summary

/// param name="str"/param

/// returns/returns

public string Decrypt(string str)

{

var ivb = Encoding.ASCII.GetBytes(_iv);

var keyb = Encoding.ASCII.GetBytes(EncryptyKey);

var tob = EncodingMode.GetBytes(str);

byte[] encrypted;

var encryptor = _des.CreateDecryptor(keyb, ivb);

var msEncrypt = new MemoryStream();

var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

csEncrypt.Write(tob, 0, tob.Length);

csEncrypt.FlushFinalBlock();

encrypted = msEncrypt.ToArray();

csEncrypt.Close();

msEncrypt.Close();

return EncodingMode.GetString(encrypted);

}

}

求DES加密算法详解拜托了各位 谢谢

DES加密算法是分组加密算法,明文以64位为单位分成块。64位数据在64位密钥的控制下,经过初始变换后,进行16轮加密迭代:64位数据被分成左右两半部分,每部分32位,密钥与右半部分相结合,然后再与左半部分相结合,结果作为新的右半部分;结合前的右半部分作为新的左半部分。这一系列步骤组成一轮。这种轮换要重复16次。最后一轮之后,再进行初始置换的逆置换,就得到了64位的密文。 DES的加密过程可分为加密处理,加密变换和子密钥生成几个部分组成。 1.加密处理过程 (1)初始变换。加密处理首先要对64位的明文按表1所示的初始换位表IP进行变换。表中的数值表示输入位被置换后的新位置。例如输入的第58位,在输出的时候被置换到第1位;输入的是第7位,在输出时被置换到第64位。 (2)加密处理。上述换位处理的输出,中间要经过16轮加密变换。初始换位的64位的输出作为下一次的输入,将64位分为左、右两个32位,分别记为L0和R0,从L0、R0到L16、R16,共进行16轮加密变换。其中,经过n轮处理后的点左右32位分别为Ln和Rn,则可做如下定义: Ln=Rn-1 Rn=Ln-1 其中,kn是向第n轮输入的48位的子密钥,Ln-1和Rn-1分别是第n-1轮的输出,f是Mangler函数。 (3)最后换位。进行16轮的加密变换之后,将L16和R16合成64位的数据,再按照表2所示的 最后换位表进行IP-1的换位,得到64位的密文,这就是DES算法加密的结果。 2.加密变换过程 通过重复某些位将32位的右半部分按照扩展表3扩展换位表扩展为48位,而56位的密钥先移位然后通过选择其中的某些位减少至48位,48位的右半部分通过异或操作和48位的密钥结合,并分成6位的8个分组,通过8个S-盒将这48位替代成新的32位数据,再将其置换一次。这些S-盒输入6位,输出4位。 一个S盒中具有4种替换表(行号用0、1、2、3表示),通过输入的6位的开头和末尾两位选定行,然后按选定的替换表将输入的6位的中间4位进行替代,例如:当向S1输入011011时,开头和结尾的组合是01,所以选中编号为1的替代表,根据中间4位1101,选定第13列,查找表中第1行第13列所示的值为5,即输出0101,这4位就是经过替代后的值。按此进行,输出32位,再按照表4 单纯换位表P进行变换,这样就完成了f(R,K)的变换 3.子密钥生成过程 钥通常表示为64位的自然数,首先通过压缩换位PC-1去掉每个字节的第8位,用作奇偶校验,因此,密钥去掉第8、16、24……64位减至56位,所以实际密钥长度为56位,而每轮要生成48位的子密钥。 输入的64位密钥,首先通过压缩换位得到56位的密钥,每层分成两部分,上部分28位为C0,下部分为D0。C0和D0依次进行循环左移操作生成了C1和D1,将C1和D1合成56位,再通过压缩换位PC-2输出48位的子密钥K1,再将C1和D1进行循环左移和PC-2压缩换位,得到子密钥K2......以此类推,得到16个子密钥。密钥压缩换位表如表6所示。在产生子密钥的过程中,L1、L2、L9、L16是循环左移1位,其余都是左移2位,左移次数如表7所示。 详细信息见

des的具体应用是什么?

数据加密标准DES

数据加密算法(Data Encryption Algorithm,DEA)的数据加密标准(Data Encryption Standard,DES)是规范的描述,它出自 IBM 的研究工作,并在 1997 年被美国政府正式采纳。它很可能是使用最广泛的秘钥系统,特别是在保护金融数据的安全中,最初开发的 DES 是嵌入硬 件中的。通常,自动取款机(Automated Teller Machine,ATM)都使用 DES。

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环。

攻击 DES 的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。

DES 的常见变体是三重 DES,使用 168 位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。如果三个 56 位的子元素都相同,则三重 DES 向后兼容 DES。

IBM 曾对 DES 拥有几年的专利权,但是在 1983 年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。

由于DES是加(解)密64位明(密)文,即为8个字节(8*8=64),可以据此初步判断这是分组加密,加密的过程中会有16次循环与密钥置换过程,据此可以判断有可能是用到DES密码算法,更精确的判断还得必须懂得一点DES的加密过程。

Crackme实例分析

本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程:

由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1.doc”)

从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。

参考: