如何成功地将IV从Python传递到Java(加密)?

发布于 2025-02-04 12:58:11 字数 2271 浏览 1 评论 0原文

我正在尝试找出加密和解密一些我从客户端(Python)到服务器(Java)的JSON数据的最佳方法。我不断遇到一些错误。最初,我有一个IV的集合,该集合既可以介入客户端和服务器,而且运行良好,它将根据需要加密和解密。但是,这显然是一个坏主意,我设置了一个随机的IV,然后将其切成薄片,然后将其切成薄片。除了前50个字节左右,它将减少大多数数据。他们只是随机chars (�6oc。

然后,当我尝试从解码字节中切除IV(16个字符)时,我会发现一个错误,说数据需要以16为单位,但是我不确定为什么这是不起作用的。

关于如何工作的任何想法?谢谢!

Python客户端

       jsonString = json.dumps(data.__dict__, default=str)

        key = 'sixteenssixteens'
        text = jsonString
        plaintext = self.pad(text)

        iv = os.urandom(16)

        cipher = AES.new(key, AES.MODE_CBC, iv)
        encrpyt_btye = cipher.encrypt(plaintext)
        encrpyt_text = base64.urlsafe_b64encode(encrpyt_btye).decode("UTF-8")

        requests.post('server', data=encrpy_text)

    def pad(self, text):
        numberBytestoPad = block_size - len(text) % block_size
        ascii_string = chr(numberBytestoPad)
        padding_str = numberBytestoPad * ascii_string
        padded_text = text + padding_str
        return padded_text

Java Server

  requestBody = exchange.getRequestBody();
            String requestData = readString(requestBody);
            System.out.println(requestData);

            String key = "sixteenssixteens";
            String initVector = requestData.substring(0, 16);

            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            try {

               //Tried to remove the IV from the start of the string
               // String removeIV = requestData.substring(16);

                Cipher cipherd = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipherd.init(Cipher.DECRYPT_MODE, skeySpec, iv);
                byte[] original = cipherd.doFinal(Base64.getUrlDecoder().decode(requestData));
                String decryptedResult = new String(original);
                System.out.println("Decrypted string: " + decryptedResult);
                try {
                    data = gson.fromJson(decryptedResult, Data.class);
                } catch (Exception ex){
                    ex.printStackTrace();
                    return;
                }

I'm trying to figure out the best way to encrypt and decrypt some JSON data that I'm passing from my client (Python) to server (Java). I keep running into a few errors. Originally I had a set IV that I had hardcoded into both client and server and it was working great, it would encrypt and decrypt as I needed. However, that's obviously a bad idea, I set a random IV that I would then slice with my server and that sorta worked. It would decrpyt most of the data, except for the first 50 bytes or so. They would just be random chars (�6OC� Ղ�{�9��aJ, "number": 1243.2,...etc) and I couldn't parse the JSON.

Then when I try to slice OFF the IV (16 chars) from the decoded bytes I get an error saying that the data needs to be in multiples of 16, but I'm not sure why that isn't working.

Any ideas on how to get this working? Thanks!

Python Client

       jsonString = json.dumps(data.__dict__, default=str)

        key = 'sixteenssixteens'
        text = jsonString
        plaintext = self.pad(text)

        iv = os.urandom(16)

        cipher = AES.new(key, AES.MODE_CBC, iv)
        encrpyt_btye = cipher.encrypt(plaintext)
        encrpyt_text = base64.urlsafe_b64encode(encrpyt_btye).decode("UTF-8")

        requests.post('server', data=encrpy_text)

    def pad(self, text):
        numberBytestoPad = block_size - len(text) % block_size
        ascii_string = chr(numberBytestoPad)
        padding_str = numberBytestoPad * ascii_string
        padded_text = text + padding_str
        return padded_text

Java Server

  requestBody = exchange.getRequestBody();
            String requestData = readString(requestBody);
            System.out.println(requestData);

            String key = "sixteenssixteens";
            String initVector = requestData.substring(0, 16);

            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            try {

               //Tried to remove the IV from the start of the string
               // String removeIV = requestData.substring(16);

                Cipher cipherd = Cipher.getInstance("AES/CBC/PKCS5PADDING");
                cipherd.init(Cipher.DECRYPT_MODE, skeySpec, iv);
                byte[] original = cipherd.doFinal(Base64.getUrlDecoder().decode(requestData));
                String decryptedResult = new String(original);
                System.out.println("Decrypted string: " + decryptedResult);
                try {
                    data = gson.fromJson(decryptedResult, Data.class);
                } catch (Exception ex){
                    ex.printStackTrace();
                    return;
                }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文