java与python数据传输的加密

这段时间在做公司项目时,需要涉及到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";
            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)

亲测可用

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发小牛牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值