Python和Java进行DES加密和解密的实例
DES为DataEncryptionStandard(数据加密标准)的缩写,是一种常见的对称加密算法。有关对称加密与非对称加密的特点及其应用场景,本文就不描述了,读者可以自行google。本文说明如何使用Java和Python两种语言来实现DES的加解密。
最近碰到的应用场景是这样的。我们需要对接一个系统S,系统S已经对用户的身份进行了验证,新系统N也需要对用户的身份进行验证。采用的身份验证方法是由旧系统S对用户ID进行加密,然后新系统N对加密后的用户ID进行解密,从而获取用户ID并进行身份验证。
由于旧系统S是用Java实现的,新系统N使用Python实现。也就是说,需要使用Python语言来对JavaDES加密的用户ID进行解密。
这里贴出Java实现的DES加密的代码。
importjavax.crypto.spec.IvParameterSpec; importjavax.crypto.Cipher; importjavax.crypto.SecretKey; importjavax.crypto.SecretKeyFactory; importjavax.crypto.spec.DESKeySpec; publicclassMain{ publicstaticvoidmain(String[]args){ Stringcontent="zx"; Stringkey="20171117"; System.out.println("加密前:"+content); byte[]encrypted=DES_CBC_Encrypt(content.getBytes(),key.getBytes()); System.out.println("加密后:"+byteToHexString(encrypted)); byte[]decrypted=DES_CBC_Decrypt(encrypted,key.getBytes()); System.out.println("解密后:"+newString(decrypted)); } publicstaticbyte[]DES_CBC_Encrypt(byte[]content,byte[]keyBytes){ try{ DESKeySpeckeySpec=newDESKeySpec(keyBytes); SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES"); SecretKeykey=keyFactory.generateSecret(keySpec); Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE,key,newIvParameterSpec(keySpec.getKey())); byte[]result=cipher.doFinal(content); returnresult; }catch(Exceptione){ System.out.println("exception:"+e.toString()); } returnnull; } privatestaticbyte[]DES_CBC_Decrypt(byte[]content,byte[]keyBytes){ try{ DESKeySpeckeySpec=newDESKeySpec(keyBytes); SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES"); SecretKeykey=keyFactory.generateSecret(keySpec); Ciphercipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE,key,newIvParameterSpec(keyBytes)); byte[]result=cipher.doFinal(content); returnresult; }catch(Exceptione){ System.out.println("exception:"+e.toString()); } returnnull; } privatestaticStringbyteToHexString(byte[]bytes){ StringBuffersb=newStringBuffer(bytes.length); StringsTemp; for(inti=0;iJava代码采用的DES加密采用CBC模式,采用PKCS5Padding的填充模式,使用的初始化向量是加密的密钥。
执行以上Java代码,输出:
加密前:zx 加密后:1DBBD4E9246EBFFA 解密后:zxPython利用pyDes对Java加密的字符串进行解密的代码如下所示。
importbinascii frompyDesimportdes,CBC,PAD_PKCS5 defdes_encrypt(s): """ DES加密 :params:原始字符串 :return:加密后字符串,16进制 """ secret_key='20171117' iv=secret_key k=des(secret_key,CBC,iv,pad=None,padmode=PAD_PKCS5) en=k.encrypt(s,padmode=PAD_PKCS5) returnbinascii.b2a_hex(en) defdes_descrypt(s): """ DES解密 :params:加密后的字符串,16进制 :return:解密后的字符串 """ secret_key='20171117' iv=secret_key k=des(secret_key,CBC,iv,pad=None,padmode=PAD_PKCS5) de=k.decrypt(binascii.a2b_hex(s),padmode=PAD_PKCS5) returnde str_en=des_encrypt('zx') print(str_en) str_de=des_descrypt(str_en) print(str_de)Python语言采用pyDes作为DES加解密处理的包。DES解密时采用CBC模式,并采用PAD_PKCS5作为填充模式,使用解密密钥作为初始化向量。这些加密的设置跟Java语言使用的是一致的。
执行以上Python代码,得到以下输出:
1dbbd4e9246ebffa zx可以看到,同对Java语言加密后的字符串,Python语言可以正常解密。
以上这篇Python和Java进行DES加密和解密的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。