python如何加密_如何在Python中加密和在Java中解密?

我正在尝试在Python程序中加密一些数据并将其保存,然后在Java程序中解密该数据。 在Python中,我像这样加密它:

1

2

3

4

5

6from Crypto.Cipher import AES

KEY = '12345678901234567890123456789012'

def encrypt(data):

cipher = AES.new(KEY, AES.MODE_CFB)

return cipher.encrypt(data)

在Java中,我将其解密为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16import java.security.*;

import javax.crypto.*;

import javax.crypto.spec.SecretKeySpec;

public class Encryption {

private static byte[] KEY = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7',

'8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2' };

public static byte[] decrypt(byte[] data) throws NoSuchAlgorithmException, NoSuchPaddingException,

InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

Cipher c = Cipher.getInstance("AES/CFB/NoPadding");

Key key = new SecretKeySpec(KEY,"AES");

c.init(Cipher.DECRYPT_MODE, key);

return c.doFinal(data);

}

}

但是我得到Exception in thread"main" java.security.InvalidKeyException: Illegal key size or default parameters。 显然,我做错了。 但是呢

您是否有合适的罐子来进行更高强度的加密? 默认情况下,java不允许使用强键。 您的错误与python结束无关,与您尝试使用的键无关。 stackoverflow.com/questions/2568841/查看Mohamed Mansour的回答

尝试使用一个简单的小键,看看它是否仍然发生。

您遇到问题的原因是因为安全策略将密钥大小限制为128位,并且您尝试使用256位密钥(需要Java密码学扩展(JCE)无限强度管辖权策略文件)。

查看此讨论,您可能会注意到您有类似的问题。我的机器上实际上有同样的问题。更新安全策略后,我能够运行您的代码。另外,我认为您应该进行以下更改c.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[16]));您缺少CFB模式的初始化向量。如果解密后的值不正确,请检查初始化密钥的方式。

我假设没有办法在小程序中使用无限强度管辖权策略文件,那么,在那里吗?

然后,您可能必须选择BouncyCastle。 这是一个非常受欢迎的选择。

我强烈建议为此使用跨语言的加密API。我是Keyczar的忠实拥护者,而且恰好拥有Java和Python库。该API大约很简单:

1

2public String encrypt(String data)

public String decrypt(String data)

在Java和Python中。

我在KeyCzar中看不到将字符串转换为密钥的任何方法。 为此,您是否需要编写自己的类? 该文档似乎假设您创建了本地文件,并且没有提及密钥交换。

关键是KeyCzar为您管理密钥。 为什么您看到需要将字符串转换为密钥? 您是否要在KeyCzar中使用现有密钥?

我投降了尝试在Android App中使用KeyCzar。 甚至我想将String转换为Key。

Python 2字符串文字(如" abc"和" abc")是ASCII。

Python 2字符串文字(如u'abc'和u" abc")是unicode。

Python 3字符串文字(如" abc"和" abc")是unicode。

Python 3字符串文字(如b'abc'和b" abc")是字节类型。

Java默认情况下使用unicode,类似于Python 3。

对于可互操作的加密语言,您可以查看https://code.google.com/p/keyczar/。该页面上有其用法的简单示例。

" Java默认使用unicode"颇具误导性。 Java在内部将字符串存储为UTF-16,但Java假定的"默认"编码完全依赖于平台。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值