首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用椭圆曲线密钥SecKeyRawSign进行签名/验证

如何用椭圆曲线密钥SecKeyRawSign进行签名/验证
EN

Stack Overflow用户
提问于 2017-07-12 10:28:23
回答 1查看 2.8K关注 0票数 3

我在iOS上生成了一个椭圆曲线私钥/公钥对,并将它们存储到安全飞地内的密钥链中。

我想用这些钥匙签名/核实一条信息。

下面是我使用SecKeyCreateSignature签名消息的代码。

代码语言:javascript
复制
var error: Unmanaged<CFError>?
let signature = SecKeyCreateSignature(myPrivateKey,
                                      .ecdsaSignatureMessageX962SHA512,
                                      plainData as CFData,
                                      &error)

它工作得很好,但是SecKeyCreateSignature只在iOS 10中可用。

我想至少保持与iOS 9的兼容性。因此,我搜索了另一种方式来签名消息,并发现了与上面的函数类似的SecKeyRawSign

但是,SecKeyRawSign似乎不支持椭圆曲线密钥。

如何使用SecKeyRawSign或其他方法来签名/验证等效或类似于上述代码的消息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-16 17:51:32

为了兼容性,您可以使用SecKeyRawSign类似于SecKeyCreateSignature

在这种情况下,它们不是等价的,因为创建签名的算法是不同的。但他们可以像往常一样签署/核实。

代码语言:javascript
复制
func signCompat(privateKey: SecKey, rawData: Data) -> Data? {
    if #available(iOS 10.0, *) {
        return sign_iOS_10(privateKey: privateKey, rawData: rawData)
    } else {
        return sign_iOS_9(privateKey: privateKey, rawData: rawData)
    }
}


@available(iOS 10.0, *)
func sign_iOS_10(privateKey: SecKey, rawData: Data) -> Data? {
    let algorithm = SecKeyAlgorithm.ecdsaSignatureMessageX962SHA512
    return SecKeyCreateSignature(privateKey, algorithm, rawData as CFData, nil) as Data?
}

func sign_iOS_9(privateKey: SecKey, rawData: Data) -> Data? {

    let sha512digestedData = rawData.sha512()
    var raw_signature_length = 512
    let raw_signature_bytes = UnsafeMutablePointer<UInt8>.allocate(capacity: 512)

    let osStatus = SecKeyRawSign(privateKey,
                                    .PKCS1SHA512,
                                    [UInt8](sha512digestedData),
                                    Int(CC_SHA512_DIGEST_LENGTH),
                                    raw_signature_bytes,
                                    &raw_signature_length)

    guard osStatus == errSecSuccess else { return nil }
    return Data(bytes: raw_signature_bytes, count: raw_signature_length)
}

// The same logic is applied to verify
//
func verifyCompat(privateKey: SecKey, rawData: Data) -> Data? { ... }

@available(iOS 10.0, *)
func verify_iOS_10(privateKey: SecKey, rawData: Data) -> Data? { ... }

func verify_iOS_9(privateKey: SecKey, rawData: Data) -> Data? { ... }

您可以使用这些openssl命令检查正确性。

代码语言:javascript
复制
// Sign
openssl dgst -sha512 -sign private.pem < test.pdf > signature.bin

// Verify
openssl dgst -sha512 -verify public.pem -signature signature.bin test.pdf
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45055139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档