无法签署数据,消息大于模数(但似乎并非如此)
Could not sign data, Message is larger than modulus (but it doesn't seem that way)
这里是新手,我正在尝试 Java 的签名函数,并且 运行 会出现奇怪的行为。
Modulus_Base64_Url = "1ry2pHOcOzyozMNod89z0hoqbLaW2oxFvKIgUir0r2BR-C4k4vhaZJxFaDc_kawUVLHTk4vdQqIakZ-WnWM5RazjI5WBnUapHr7XCAEI2_lBjvmJRueV0nJNwhkLnU1U2xPX9xquWLpNO9iT7CpYJOe6K1rj8Clc7SnTGoHP3DT4jbnwF2eGTLF07_MrelqPO2xh0qg2XK1pNjwO1Z-4di6L0XTGkN7-hMTLoRDCPey8AcFr_LGJEfd1Fo2FOhDWwN2mL7ZxEYM8n1kMUJCAkCjnUKJnRjUS6qM1L181jBq1iXy33DvkyP50XCeE2-J9ee6z02-L787Smtrmya330w";
PrivateExponent_Base64_Url = "DgRnj7iUPDGreyJOUXPTRaW7mzkYA9AgRT34CiUPr9sDvsWUVtSLYgHpbfIdTi8DbLvm6by5hr36KgNW25M8i9XLReleepvAMmeWtckLgQB2TRTw5xX666_Wb5Me9Pe1UE-tS04Mj3Ip1HxAu6vP8SjHOElIk8a_cCPIyfQrU15rK4d71VuwObBeA2g7pJtC7h6WBxEHg0K73xHDKsesDWLE2IbhrRKPLFPtXSIb9ySWgqEXEmX0nX5n6Q1zPwAvKURrpX58XDpUVoVX7YfusbhKDfRE_1GJ-5SbuTNQorZFFTSvrZNCvZY6FDzuZtHOHluwT1OGNjLXLr-iIX2-IQ";
byte[] Message = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
Modulus = java.util.Base64.getUrlDecoder().decode(Modulus_Base64_Url);
PrivateExponent = java.util.Base64.getUrlDecoder().decode(PrivateExponent_Base64_Url);
keySpec = java.security.spec.RSAPrivateKeySpec(java.math.BigInteger(Modulus), java.math.BigInteger(PrivateExponent));
keyFactory = java.security.KeyFactory.getInstance("RSA");
privateKey = keyFactory.generatePrivate(keySpec);
signature = java.security.Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(Message);
signature.sign();
此代码在最后的 signature.sign() 语句处失败。我得到的错误是
javax.crypto.BadPaddingException: Message is larger than modulus
然而,这里的消息只有 10 个字节长。
如有任何想法,我们将不胜感激。
原因是解码为BigInteger
时模数变为负数。 Moduli 通常存储为无符号大端值,而 Java 将数组视为有符号大端值。
但是,您可以简单地强制符号为正,方法是使用new BigInteger(1, value)
,其中1
表示正号。
这里是新手,我正在尝试 Java 的签名函数,并且 运行 会出现奇怪的行为。
Modulus_Base64_Url = "1ry2pHOcOzyozMNod89z0hoqbLaW2oxFvKIgUir0r2BR-C4k4vhaZJxFaDc_kawUVLHTk4vdQqIakZ-WnWM5RazjI5WBnUapHr7XCAEI2_lBjvmJRueV0nJNwhkLnU1U2xPX9xquWLpNO9iT7CpYJOe6K1rj8Clc7SnTGoHP3DT4jbnwF2eGTLF07_MrelqPO2xh0qg2XK1pNjwO1Z-4di6L0XTGkN7-hMTLoRDCPey8AcFr_LGJEfd1Fo2FOhDWwN2mL7ZxEYM8n1kMUJCAkCjnUKJnRjUS6qM1L181jBq1iXy33DvkyP50XCeE2-J9ee6z02-L787Smtrmya330w";
PrivateExponent_Base64_Url = "DgRnj7iUPDGreyJOUXPTRaW7mzkYA9AgRT34CiUPr9sDvsWUVtSLYgHpbfIdTi8DbLvm6by5hr36KgNW25M8i9XLReleepvAMmeWtckLgQB2TRTw5xX666_Wb5Me9Pe1UE-tS04Mj3Ip1HxAu6vP8SjHOElIk8a_cCPIyfQrU15rK4d71VuwObBeA2g7pJtC7h6WBxEHg0K73xHDKsesDWLE2IbhrRKPLFPtXSIb9ySWgqEXEmX0nX5n6Q1zPwAvKURrpX58XDpUVoVX7YfusbhKDfRE_1GJ-5SbuTNQorZFFTSvrZNCvZY6FDzuZtHOHluwT1OGNjLXLr-iIX2-IQ";
byte[] Message = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57};
Modulus = java.util.Base64.getUrlDecoder().decode(Modulus_Base64_Url);
PrivateExponent = java.util.Base64.getUrlDecoder().decode(PrivateExponent_Base64_Url);
keySpec = java.security.spec.RSAPrivateKeySpec(java.math.BigInteger(Modulus), java.math.BigInteger(PrivateExponent));
keyFactory = java.security.KeyFactory.getInstance("RSA");
privateKey = keyFactory.generatePrivate(keySpec);
signature = java.security.Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(Message);
signature.sign();
此代码在最后的 signature.sign() 语句处失败。我得到的错误是
javax.crypto.BadPaddingException: Message is larger than modulus
然而,这里的消息只有 10 个字节长。
如有任何想法,我们将不胜感激。
原因是解码为BigInteger
时模数变为负数。 Moduli 通常存储为无符号大端值,而 Java 将数组视为有符号大端值。
但是,您可以简单地强制符号为正,方法是使用new BigInteger(1, value)
,其中1
表示正号。