您的位置:首页 > 编程语言 > Python开发

java与python数据传输的加密

2018-02-01 15:40 330 查看
这段时间在做公司项目时,需要涉及到Java与Python之间,传输数据,前期为了先实现效果不涉及任何加密,因为我们做的项目中有涉及到支付的信息,所以必须要加密。后期对项目中所有与支付相关的部分全部进行了加密。

任务描述

支付这边使用的是Java,前端使用的是python。最开始的时候我自己准备的加密/解密的代码可以自己加密,自己解密,前端那边的也是OK的。但是与前端对接时发现这样是行不通的,前端加密的代码,拿到我这边无法解密,我把响应发给前端,前端也无法解密。各种调试,最终仍然不行,最后没办法了,不自己写了,去网搜搜,找现成的。参考如下:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php,解决了大问题。这里面包含有C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现。非常感谢原作者。

这个问题解决了以后,着手解决,前端发送过来数据的问题。

处理流程:

前端将要发送的数据处理成json字符串,再进行AES加密。发送给我这边,拿到数据之后首先我进行AES解密,解密完后,将json字符串,转换为json对象,然后就可以从json对象中获取到要使用的数据。这个过程还是非常轻松的。我这边处理完成之后,将数据转成json字符串,AES加密后发送给前端,然后前端与我的操作是完全一样的。这样整个问题全部解决。

正常流程:

当然在操作过程中存在一定的不足之处就是,进行解密的密钥是单独存放在我们自己的程序中的。实际上大多数的操作中都是将随机生成的密钥进行非对称加密,将密文进行对称加密,然后同时将密钥,密文和密钥的公钥或者私钥中的一个发送到前端,前端使用非对称加密通过拿到的密文的公钥或者私钥,首先将密钥解密,然后再使用密钥去将密文解密,后面再进行其他的操作。这是一个完成的流程,我们项目比较紧,只是前端与支付端使用同样的密钥,在请求时只发送密文。拿到之后直接使用密文解密。后期项目完成再进行完善吧。现阶段首先需要实现功能。

说了这么多,下面是代码。

Java加密与解密:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.junit.Test;

...

@Test
public void testCrossLanguageEncrypt() throws Exception{
System.out.println(encrypt());
System.out.println(desEncrypt());
}

public static String encrypt() throws Exception {
try {
String data = "Test String";
String key = "1234567812345678";

9c54
String iv = "1234567812345678";
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
return new sun.misc.BASE64Encoder().encode(encrypted);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static String desEncrypt() throws Exception {
try
{
String data = "2fbwW9+8vPId2/foafZq6Q==";
String key = "1234567812345678";
String iv = "1234567812345678";

byte[] encrypted1 = new sun.misc.BASE64Decoder().decodeBuffer(data);

Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original);
return originalString;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}


python代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
PADDING = '\0'
#PADDING = ' '
pad_it = lambda s: s+(16 - len(s)%16)*PADDING
key = '1234567812345678'
iv = '1234567812345678'
source = 'Test String'
generator = AES.new(key, AES.MODE_CBC, iv)
crypt = generator.encrypt(pad_it(source))
cryptedStr = base64.b64encode(crypt)
print cryptedStr
generator = AES.new(key, AES.MODE_CBC, iv)
recovery = generator.decrypt(crypt)
print recovery.rstrip(PADDING)


亲测可用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: