首页 > 解决方案 > IOS 和 JAVA 中带有 RSA 的 SHA 提供 InvalidKeySpecification

问题描述

我正在按照以下 URL 在 IOS 设备中构造私钥和公钥,并且后端代码正在使用 java 进行验证。

RSA 在 iOS (Swift) 上签名并在 Java 中验证

让我分享一下Java的代码片段

public static void main(String[] args) {
        String messageText = "Hello World!";
        final byte[] signature = Base64.decodeBase64("");
        final byte[] modulus = Base64.decodeBase64("") ;
        final byte[] exponent = Base64.decodeBase64("");
        try {
            final Signature sig = Signature.getInstance("SHA512withRSA");
            final KeyFactory keyMaker = KeyFactory.getInstance("RSA");
            final RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modulus),
                    new BigInteger(exponent));
            final RSAPublicKey pubKey = (RSAPublicKey)keyMaker.generatePublic( pubKeySpec );
            sig.initVerify( pubKey );
            sig.update( messageText.getBytes() );
            final boolean result = sig.verify( signature );
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }

我像IOS代码一样运行上面的代码并将输出作为输入传递给java方法并低于异常


{

    exponent = {length = 4, bytes = 0x41514142};

    modulus = {length = 172, bytes = 0x414d4d61 734a4c4d 30755658 38656e79 ... 5a357332 506a6e64 };

    signature = {length = 128, bytes = 0x42b66ff0 e47aa4c3 f9b4ff38 664a4d87 ... 24cf05ac 4e8e0dc0 };

    text = "Hello World!";

}

堆栈跟踪

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: RSA keys must be at least 512 bits long
    at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:239)
    at java.base/java.security.KeyFactory.generatePublic(KeyFactory.java:352)
    at care.solve.node.SignatureValidationMain.main(SignatureValidationMain.java:53)
Caused by: java.security.InvalidKeyException: RSA keys must be at least 512 bits long
    at java.base/sun.security.rsa.RSAKeyFactory.checkKeyLengths(RSAKeyFactory.java:167)
    at java.base/sun.security.rsa.RSAKeyFactory.checkRSAProviderKeyLengths(RSAKeyFactory.java:145)
    at java.base/sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:92)
    at java.base/sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:340)
    at java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:235)

这是 IOS 代码片段,我们使用了这个 Heimdall 框架https://github.com/henrinormak/Heimdall

self.heimdall = Heimdall(tagPrefix: "com.hnormak.heimdall.example", keySize: 1024)

let text = "Hello World!"

let publicKey = heimdall!.publicKeyComponents()!

let modulus = publicKey.modulus.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0))

let exponent = publicKey.exponent.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0))

let signature = heimdall!.sign((text.data(using: String.Encoding.utf8)?.base64EncodedData(options: Data.Base64EncodingOptions(rawValue: 0)))!)

let verSig = Data(base64Encoded: signature!, options: Data.Base64DecodingOptions(rawValue: 0))

let message: NSDictionary = ["text": text, "signature": signature, "modulus": modulus, "exponent": exponent ]

print(message)

标签: javaiosswift

解决方案


推荐阅读