RSA 登录 iOS (Swift) 并在 Java 中验证
RSA Sign on iOS (Swift) and Verify in Java
我在 iOS 上签署数据并在 Java 上验证它时遇到问题。
到目前为止我尝试了什么:
iOS (Swift):
let text = "Hello World!"
let publicKey = heimdall.publicKeyComponents()!
let hashedText = text.sha512()
let modulus = publicKey.modulus.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let exponent = publicKey.exponent.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let signature = heimdall.sign(hashedText.dataUsingEncoding(NSUTF8StringEncoding)!)!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let verSig = NSData(base64EncodedString: signature, options: NSDataBase64DecodingOptions(rawValue: 0))
let message: NSDictionary = ["text": text, "signature": signature, "modulus": modulus, "exponent": exponent ]
我正在使用 Swift Heimdall 进行 RSA 密钥处理,消息通过 http 作为 JSON 发送。
在Java侧:
final byte[] signature = Base64.decodeBase64( message.getSignature() );
final byte[] modulus = Base64.decodeBase64( message.getModulus() ) ;
final byte[] exponent = Base64.decodeBase64( message.getExponent() );
final String messageText = message.getText();
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 );
但结果总是错误的:-/
据我所知,数据已正确传输。
也许我在搞乱编码。
我解决了问题,删除了消息的初始散列(iOS)。然后一切正常。 Heimdall.sign 在签名之前已经对数据进行哈希处理。
我在 iOS 上签署数据并在 Java 上验证它时遇到问题。
到目前为止我尝试了什么:
iOS (Swift):
let text = "Hello World!"
let publicKey = heimdall.publicKeyComponents()!
let hashedText = text.sha512()
let modulus = publicKey.modulus.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let exponent = publicKey.exponent.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let signature = heimdall.sign(hashedText.dataUsingEncoding(NSUTF8StringEncoding)!)!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let verSig = NSData(base64EncodedString: signature, options: NSDataBase64DecodingOptions(rawValue: 0))
let message: NSDictionary = ["text": text, "signature": signature, "modulus": modulus, "exponent": exponent ]
我正在使用 Swift Heimdall 进行 RSA 密钥处理,消息通过 http 作为 JSON 发送。
在Java侧:
final byte[] signature = Base64.decodeBase64( message.getSignature() );
final byte[] modulus = Base64.decodeBase64( message.getModulus() ) ;
final byte[] exponent = Base64.decodeBase64( message.getExponent() );
final String messageText = message.getText();
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 );
但结果总是错误的:-/ 据我所知,数据已正确传输。 也许我在搞乱编码。
我解决了问题,删除了消息的初始散列(iOS)。然后一切正常。 Heimdall.sign 在签名之前已经对数据进行哈希处理。