热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python和java使用AES加密算法加密字符串得到加密后的加密串不一样

问题描述1,问题详情描述,对同一段字符串分别使用java和python的AES加密算法,进行加密。得到的加密串不同。2,2,问题描述补充1,两次加密的变

问题描述

1,问题详情描述,对同一段字符串分别使用java和python的AES加密算法,进行加密。得到的加密串不同。
2,
2,问题描述补充1,两次加密的变量,加密密钥(key),偏移量(iv),加密模式(CFB)均相同。加密字符串相同。
3,问题描述补充2,加密字符串经历过一次BASE64加密




问题出现的环境背景及自己尝试过哪些方法


相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
python 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python

# -*- coding: utf-8 -*-



from Crypto.Cipher import AES

import base64

import os



BLOCK_SIZE = 16

PADDING = '\0'

pad_it = lambda s: s+(16 - len(s)%16)*PADDING

key = b'B31F2A75FBF94099'

iv = b'1234567890123456'



#使用aes算法,进行加密解密操作

#为跟java实现同样的编码,注意PADDING符号自定义

def encrypt_aes(sourceStr):

    generator = AES.new(key, AES.MODE_CFB, iv)

    crypt = generator.encrypt(pad_it(sourceStr).encode('utf-8'))

    cryptedStr = base64.b64encode(crypt)

    return cryptedStr



def decrypt_aes(cryptedStr):

    generator = AES.new(key, AES.MODE_CFB, iv)

    cryptedStr = base64.b64decode(cryptedStr)

    recovery = generator.decrypt(cryptedStr)

    decryptedStr = recovery.rstrip(PADDING.encode('utf-8'))

    return decryptedStr



sourceStr = '{"abc":"dfr","agh":"fdfd"}'





print('明文:',sourceStr)

print('加密串:',encrypt_aes(sourceStr))

print('解密串:',decrypt_aes(encrypt_aes(sourceStr)).decode('utf-8'))



python运行结果:



明文: 你好

加密串: b'bYywQggIyUep1a55IRMe2Au0xGw='

解密串: 你好



java代码:



package com.ehai.enctypt.aes;



import java.util.Base64;



import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;



public class AESEncrypt {



    /**

     * 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。

     */

    private static String sKey = "B31F2A75FBF94099";

    private static String ivParameter = "1234567890123456";



    public static void main(String[] args) {

        String raw = "你好";



        try {

            String encryptRaw = AESEncrypt.encrypt(raw);

            System.out.println("加密串:" + encryptRaw);



            String decryptRaw = AESEncrypt.decrypt(encryptRaw);



            System.out.println("解秘串:" + decryptRaw);



        } catch (Exception e) {



            e.printStackTrace();

        }



    }



    public static String encrypt(String sSrc) throws Exception {

        Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");

        byte[] raw = sKey.getBytes();

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

        IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度

        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));

        // return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码。

        return new String(Base64.getEncoder().encode(encrypted), "UTF-8");

    }



    // 解密

    public static String decrypt(String sSrc) throws Exception {

        try {

            byte[] raw = sKey.getBytes("ASCII");

            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

            Cipher cipher = Cipher.getInstance("AES/CFB/PKCS5Padding");

            IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

            // byte[] encrypted1 = new

            // BASE64Decoder().decodeBuffer(sSrc);//先用base64解密

            byte[] encrypted1 = Base64.getDecoder().decode(sSrc);

            byte[] original = cipher.doFinal(encrypted1);

            String originalString = new String(original, "utf-8");

            return originalString;

        } catch (Exception ex) {

            return null;

        }

    }



}







java运行结果:

明文:你好

加密串:bRfM0cD63D96il8ZeXhJEw==

解秘串:你好


你期待的结果是什么?实际看到的错误信息又是什么?

期望java和python得到同样的加密和解密结果。





   



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • python实现内容写在图片上的方法
    这篇文章主要介绍python实现内容写在图片上的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码内容如下:#-*-co ... [详细]
author-avatar
达达2502854565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有