当前位置: 首页 > 知识库问答 >
问题:

Python到Java加密(RSA)

华化
2023-03-14

我在python上做加密,在Java上尝试解密,但总是得到解密错误

我在Java有部分加密和解密信息代码,用RSA编码解密:

import java.security.*;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

public class Decrypter
{
    public static void main(String[] args)
    {

        try {
            String encoded_data = "PueF1RC5giqmUK9U+X80SwjAjGmgfcHybjjQvWdqHSlua1rv6xr7o6OMutHBU+NRuyCJ3etTQssYOMGiWPITbEC8xr3WG9H9oRRnvel4fYARvQCqsGmf9vO9rXcaczuRKc2zy6jbutt59pKoVKNrbonIBiGN1fx+SaStBPe9Jx+aZE2hymDsa+xdmBSCyjF30R2Ljdt6LrFOiJKaDiYeF/gaej1b7D8G6p0/HBPxiHMWZhx1ZfylSvZ6+zyP0w+MJn55txR2Cln99crGtcdGeBDyBtpm3HV+u0VlW7RhgW5b+DQwjQ/liO+Ib0/ZIPP9M+3sipIwn2DKbC45o0FZHQ==";
            byte[] decodeData = Base64.getDecoder().decode(encoded_data);

            String publicKeyString = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzN2+mrQRXKshq3k0r06" +
                    "0/FoWafOCl6fCCyuu/7SejNU95SN2LZyopA3ipamY5MeK1G1XHOhEfkPWcYcgUbz" +
                    "TdD166nqJGi/O+rNK9VYgfhhqD+58BCmLlNidYpV2iDmUZ9B/cvVsQi96GY5XOaK" +
                    "xuVZfwrDK00xcOq+aCojQEvMh+gry05uvzfSv9xK3ki5/iCMY62ReWlmrY0B19CQ" +
                    "47FuulmJmrxi0rv2jpKdVsMq1TrOsWDGvDgZ8ieOphOrqZjK0gvN3ktsv63kc/kP" +
                    "ak78lD9opNmnVKY7zMN1SdnZmloEOcDB+/W2d56+PbfeUhAHBNjgGq2QEatmdQx3" +
                    "VwIDAQAB";
            KeyFactory kf = KeyFactory.getInstance("RSA");
            byte[] encodedPb = Base64.getDecoder().decode(publicKeyString);
            X509EncodedKeySpec keySpecPb = new X509EncodedKeySpec(encodedPb);
            PublicKey pubKey = kf.generatePublic(keySpecPb);


            Cipher cipherDecr = Cipher.getInstance("RSA");
            cipherDecr.init(Cipher.DECRYPT_MODE, pubKey);
            byte[] cipherDataDecr = cipherDecr.doFinal(decodeData);
            String result = new String(cipherDataDecr);
            System.out.println("result = "+result);
        }catch (Exception e){
            e.printStackTrace(System.out);
        }

    }
}

不幸的是,我无法在这段代码中进行更改,所以我所能做的就是在python部分中进行更改。这部分工作正常。为了检查,我使用以下代码进行加密:

import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import javax.crypto.Cipher;

public class Encrypter
{
    public static void main(String[] args)
    {
        try {   
            String data = "111111111222";
            String privateKeyString = "here is my privat key";

            byte [] encoded = Base64.getDecoder().decode(privateKeyString);
            System.out.println("encoded = "+encoded);

            java.security.Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            KeySpec ks = new PKCS8EncodedKeySpec(encoded);
            RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(ks);
            System.out.println("privKey = "+privKey);

            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, privKey);

            byte[] cipherData = cipher.doFinal(data.getBytes());

            String card = Base64.getEncoder().encodeToString(cipherData);
            System.out.println("data = "+card);
        }catch (Exception e){
            e.printStackTrace(System.out);
        }

    }
}

当我使用来自Java代码的结果进行加密,并将这个结果用于解密Java文件--所有的工作都很好。我需要相同的加密部分,但编写与Python。

python加密部分

import base64
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5

data = '111111111222'
privat_key = 'here is my privat key'
key = RSA.importKey(privat_key)
cipher = PKCS1_v1_5.new(key)
encrypted_message = str(base64.b64encode(cipher.encrypt(base64.b64decode(data))), 'utf8')
print(encrypted_message)

那么,问题是我应该如何加密的消息,以正确的解密与Java?我尝试了不同的库(标准rsa、Pycrypto rsa、PKCS1_OAEP、PKCS1_v1_5),但没有任何帮助

附注。我知道密钥对的使用方法是错误的,但这是外部系统的要求

更新:

使用新实例获取某些结果。正如Maarten Bodewes所说,我改变了格式

Cipher cipherDecr=Cipher.getInstance(“rsa/ecb/nopadding”);

解密结果:2 O(rm@/u*d{w b+v[$#sf1x}1t%`ya/?ejxt+6y4d!

我看不懂,但这不是例外,很好。试着往这边走

更新:

我将Java使用RSA/ECB/PKCS1Padding定义为默认值。所以我应该在python中使用相同的

共有1个答案

慕容博涛
2023-03-14

首先我定义了Java

Cipher cipher = Cipher.getInstance("RSA");

扩展于

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");

Cipher cipher = Cipher.getInstance("RSA/None/PKCS1PADDING");

对于RSA而言,第二个参数(无或ECB)中定义的内容没有区别。RSA不用它。

所以我需要在Python加密中添加填充。不幸的是PyCrypto没有PKCS1PADDING,所以我不能用这个padding加密。

下一步,我找到了M2Crypto lib https://gitlab.com/M2Crypto/M2Crypto这个分叉对Python3有效。只需下载并构建它(repo中的说明)

比我写这段代码还管用:

import M2Crypto

# read privat key
privatKey = M2Crypto.RSA.load_key('privat.key')
# encrypt plaintext using privat key
ciphertext = privatKey.private_encrypt(data.encode('utf-8'), M2Crypto.RSA.pkcs1_padding)

encrypted_message = str(base64.b64encode(ciphertext), 'utf8')
print(encrypted_message)

仅此而已。它对我有用,我相信,它能帮助你。

 类似资料:
  • 我有一段Java代码,负责加密和解密,需要将其转换为Ruby。在这里发布之前,我通过了4个链接,但没有运气。 aes-cbc-pkcs5padding-encrypt-in-java-decrypt-in-ruby aes-cbc-pkcs5padding-implementation-in-ruby-for-rails 主旨github。通用域名格式 Ruby中的对称加密算法 为了得到相同的结果

  • 我想把加密/解密从Java复制到PHP。但我的问题是结果不匹配。我对Java不了解,所以我试着理解Java的每一行代码,并用PHP编写。 Java 下面是使用Java来复制PHP中的函数的步骤。 > 使用SHA1创建哈希 使用utf-8编码将secretkey(从凭据)转换为字节数组 使用xeroes填充步骤2,截断或填充零(如有必要),使副本具有指定的长度24 使用DESede使用步骤3中的ke

  • 我加密的是对称的AES密钥,它加密我的实际数据,所以密钥长度是16字节。当简单的base64编码密钥时,一切都正常,所以我知道这个RSA加密有问题。 下面是我的iOS调用的一个示例: 下面是我的Java调用的一个示例: null 当我进行更多测试时,我看到了这个页面(http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/pkcs/pkcs1/rsa

  • 我的任务是在一个项目上实现AES加密。参考代码是用Java编写的,需要转换成Python。当我整理笔记写一个问题时,我无意中发现了答案!希望其他人会觉得这很有用,我将在这里把我的笔记作为一个“分享你的知识”的问题提出来。 要求使用具有给定密钥的AES加密消息。下面是参考代码(Java)的简化视图, 如果将上述内容另存为“EncryptAES”。并保留库文件在同一目录中,您可以使用以下命令编译它,

  • 问题内容: 我试图来回编码一个简单的String“ test”。 但是,尽管加密工作得很好(ALGORITHM是“ RSA”),但是当尝试解密刚刚从加密“ test”中获得的字符串时,出现以下异常: javax.crypto.IllegalBlockSizeException:数据不得超过256个字节 我是否应该将加密的字节分成256个块才能解密? 问题答案: 您无法可靠地将随机字节转换为。结果将