Java 计算密码时的32位64位差异

Java 计算密码时的32位64位差异,java,encryption,cryptography,Java,Encryption,Cryptography,我有一个简单的Xades/BES实现和两种情况 在Windows 7上32位 使用java 在Windows 2008 Server 64位上,使用相同的JVM 我的应用程序在32位Windows 7上运行得非常好,但是当我尝试在Windows 2008 Server中运行编译后的代码时,我得到一个错误: javax.crypto.BadPaddingException: Data must start with zero at sun.security.rsa.RSAPadd

我有一个简单的Xades/BES实现和两种情况

  • 在Windows 7上32位 使用java

  • 在Windows 2008 Server 64位上,使用相同的JVM

  • 我的应用程序在32位Windows 7上运行得非常好,但是当我尝试在Windows 2008 Server中运行编译后的代码时,我得到一个错误:

        javax.crypto.BadPaddingException: Data must start with zero
        at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
        at sun.security.rsa.RSAPadding.unpad(Unknown Source)
        at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:349)
        at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
        at javax.crypto.Cipher.doFinal(Cipher.java:2087)
    
    问题代码字段如下所示:

        public static byte[] getDecryptedSignatureValue(XMLSignature signature) throws         XadesElementException, InvalidKeyException
    {
        byte[] signatureValue = null;
        try {
            KeyInfo keyInfo = signature.getKeyInfo();            
            PublicKey key = keyInfo.getPublicKey();            
            Cipher cipher = getCipher("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
    
            signatureValue = signature.getSignatureValue();
            byte[] cipherData = cipher.doFinal(signatureValue);
            return cipherData;
    
        } catch (KeyResolverException | XMLSignatureException | IllegalBlockSizeException | BadPaddingException ex) {
            Logger.getLogger(KeyUtils.class.getName()).log(Level.SEVERE, null, ex);
            Logger.getLogger(KeyUtils.class.getName()).log(Level.SEVERE, null, "SignatureValue:"+ BaseUtils.toBase64String(signatureValue));
        } finally {
    
        }
        return null;
    
    }
    
    我唯一能想到的就是架构上的差异。我是不是遗漏了什么?有什么问题吗

    提前谢谢

    编辑: 以下是我的新发现。 1.我已经在64位Windows 7上测试了我的应用程序,在签名和验证时没有问题。 2.更有趣的是,我已经在另一台64位Windows2008服务器上测试了该应用程序,并取得了成功


    我认为有些东西有一个配置设置,但我不知道它是什么。

    这可能是由于选择了提供程序和/或提供程序实现。请注意,PKCS#1填充用于加密(EME-PKCS1-v1#U 5解码)和PKCS#1填充用于签名验证(EMSA-PKCS1-v1#U 5编码)之间存在差异。一些提供程序将根据密钥类型(公共或私有)选择填充,其他提供程序将根据您使用的是
    密码
    还是
    签名
    而保留单个填充方案

    如果可能,尝试使用
    签名
    进行签名验证,而不是使用公钥进行
    密码
    解密。否则,请检查选择了哪些提供程序(使用例如
    Cipher.getProvider()
    ),并尝试找到一个有效的提供程序。请注意,正如您可能已经发现的那样,解密成功或失败取决于实现,而非接口规范

    因此,目前它正在尝试解码:

    EM = 0x00 || 0x02 || PS || 0x00 || M
    
    使用随机、非零PS和消息M

    但是,您希望验证这一点:

    EM = 0x00 || 0x01 || PS || 0x00 || T
    

    使用值为
    FF
    的PS,T为ASN.1 DER编码算法OID和哈希值。

    我按照您的建议使用了签名。它解决了验证问题,但它实际上向我表明问题不是我认为的验证。因为现在我可以在32位Windows 7上签名并验证签名(事实上我已经能够做到了)不过,我可以签名,但无法在Windows 2008 Server 64位上验证签名。有趣的是,我可以在Windows Server 2008 64位上验证在Windows 7 32位上签名的文档。我将更深入地了解该提供程序。如果您有任何想法,请让我知道。您打印了
    签名
    密码
    在所有平台上?您好?您对这个问题处理得怎么样?
    EM = 0x00 || 0x01 || PS || 0x00 || T