aes的ecb加密 java,使用AES/ECB/PKSC5加密,将Java迁移到Python

我的任务是在一个项目中实现AES加密。参考代码是用Java编写的—需要转换成Python。当我整理笔记写一个问题时,我意外地发现了答案!希望其他人能发现这个有用,我在这里将我的笔记作为一个“分享你的知识”的问题提出来。在

要求是使用具有给定密钥的AES加密消息。下面是参考代码(在Java中)的简化视图import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

import sun.misc.BASE64Encoder;

public class EncryptAES {

private static String toHexString(byte[] data) {

StringBuffer buf = new StringBuffer();

for (int i = 0; i < data.length; ++i) {

String s = Integer.toHexString(data[i] & 0XFF);

buf.append((s.length() == 1) ? ("0" + s) : s);

}

return buf.toString();

}

public static String encrypt(String input, String key) {

byte[] crypted = null;

try {

SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, skey);

crypted = cipher.doFinal(input.getBytes());

final String encryptedString = toHexString(Base64.encodeBase64(crypted));

return encryptedString;

} catch (Exception e) {

System.out.println(e.toString());

}

return new String(new BASE64Encoder().encode(crypted));

}

public static void main(String[] args) {

String key = args[0];

String plaintext = args[1];

System.out.println("KEY = " + key);

System.out.println("PLAINTEXT = " + plaintext);

System.out.println("CIPHER = " + EncryptAES.encrypt(plaintext, key));

}

}

如果您将上述内容保存为'加密.java'并将库文件commons-codec-1.7.jar保存在同一目录中,可以使用以下命令编译它

^{pr2}$

这是运行程序几次时的输出$ java -cp "commons-codec-1.7.jar:." EncryptAES ddddffffeeeerrrr message

KEY = ddddffffeeeerrrr

MESSAGE = message

CRYPTO = 397a59594d35524e6b6a463253706f41467668646b773d3d

$

$ java -cp "commons-codec-1.7.jar:." EncryptAES qqqqwwwweeeerrrr ThisIsAVeryImportantMessage

KEY = qqqqwwwweeeerrrr

PLAINTEXT = ThisIsAVeryImportantMessage

CIPHER = 56536a384d667736756b595a394e396b6d504d736231444673375250736d5639596f637072792f6e4b424d3d

$

环顾四周,我发现了Python加密库。这是我早期复制上述输出的尝试之一#!/usr/bin/python

import sys

from Crypto.Cipher import AES

if __name__ == '__main__':

key = sys.argv[1]

plaintext = sys.argv[2]

print 'KEY = ' + key

print 'PLAINTEXT = ' + plaintext

encobj = AES.new(key, AES.MODE_ECB)

ciphertext = encobj.encrypt(plaintext)

print 'CIPHER = ' + ciphertext.encode('hex')

这不太符合我的需要。相反,我得到一条错误消息,说明输入字符串的长度必须是16的倍数。这让我想到了下一次尝试#!/usr/bin/python

import sys

from Crypto.Cipher import AES

# ref: https://gist.github.com/crmccreary/5610068

BS = 16

pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

unpad = lambda s : s[0:-ord(s[-1])]

class AESCipher:

def __init__( self, key ):

"""

Requires hex encoded param as a key

"""

self.key = key.decode("hex")

def encrypt( self, raw ):

"""

Returns hex encoded encrypted value!

"""

raw = pad(raw)

cipher = AES.new(self.key, AES.MODE_ECB)

return cipher.encrypt(raw).encode("hex")

if __name__ == '__main__':

key = sys.argv[1]

plaintext = sys.argv[2]

print 'KEY = ' + key

print 'PLAINTEXT = ' + plaintext

# ref: http://stackoverflow.com/a/16882092

hex_key = "".join("{:02x}".format(ord(c)) for c in key)

encryptor = AESCipher(hex_key)

ciphertext = encryptor.encrypt(plaintext)

print 'CIPHER = ' + ciphertext

老实说,我真的不知道该怎么做$ python EncryptAES2.py ddddffffeeeerrrr message

KEY = ddddffffeeeerrrr

PLAINTEXT = message

CIPHER = f7361833944d9231764a9a0016f85d93

$

我尝试了很多东西-不同的加密模式,博客,还有问题,放弃了自己寻找解决方案。就在这一点上,我决定收集我的笔记,在这里问一个问题。现在,如果我不列出我的尝试就没有什么意义了,所以我开始把它们组织到一个文件夹中,并将它们标记为EncryptAES.py,EncryptAES2.py。。等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值