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加密与解密:
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)
亲测可用
相关文章推荐
- [置顶] 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)
- qt及java端实现自定义数字签名,数据加密传输。
- 高性能数据序列化库,可序列化为binary,也可序列化为json,支持C++ java python php objectc 语言,兼容json数据格试,可以互相转换,跨语言交换数据,网络传输,远程调
- java&javascript自定义加密数据传输代码示例
- java & javascript 自定义加密数据传输
- C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现【多种语言AES/CBC/PKCS5Padding通用加解密数据】
- 数据传输加密:非对称加密算法RSA+对称算法AES(适用于java,android和Web)
- DES和RSA加密数据传输信息Java实现
- java & javascript 自定义加密数据传输
- java前后端RSA加密传输数据
- 网页数据传输加密方法(前js+后java)
- java后端发布的接口数据是如何加密传输
- python天天进步(6)--网络编程之数据传输TCP
- python天天进步(5)--网络编程之数据传输UDP
- flex - java 数据传输
- java数据传输C-S
- 服务器使用Gzip压缩数据,加快网络传输(Java 例子)
- Java使用ExecutorService线程池通过Socket传输AES加密,并在客户端用ServerSocket解密
- JAVA Socket传输数据和对象
- 【发现】表单数据的加密传输