Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

class ECDSAPrivateKey

public class ECDSAPrivateKey <: PrivateKey {
    public init(curve: Curve)
}

功能:ECDSA 私钥类,提供生成 ECDSA 私钥能力,ECDSA 的私钥支持签名操作,同时支持 PEM 和 DER 格式的编码解码。使用示例见 ECDSA 密钥示例

父类型:

init(Curve)

public init(curve: Curve)

功能:init 初始化生成私钥。

参数:

  • curve: Curve - 椭圆曲线类型。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)
    println("ECDSA私钥创建成功")
    println("密钥类型: ${key}")

    return 0
}

运行结果:

ECDSA私钥创建成功
密钥类型: ECDSA PRIVATE KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): ECDSAPrivateKey

功能:将私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = ECDSAPrivateKey(Curve.P256)
    let encodedBlob = originalKey.encodeToDer()

    // 核心演示:从 DerBlob 解码还原 ECDSA 私钥
    let decodedKey = ECDSAPrivateKey.decodeDer(encodedBlob)
    println("解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码成功
解码后密钥类型: ECDSA PRIVATE KEY

static func decodeDer(DerBlob, ?String)

public static func decodeDer(blob: DerBlob, password!: ?String): ECDSAPrivateKey

功能:将加密的私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = ECDSAPrivateKey(Curve.P256)
    let encodedBlob = originalKey.encodeToDer(password: "mypassword")

    // 核心演示:从 DerBlob 解码还原 ECDSA 私钥
    let decodedKey = ECDSAPrivateKey.decodeDer(encodedBlob, password: "mypassword")
    println("解码加密DER成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码加密DER成功
解码后密钥类型: ECDSA PRIVATE KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): ECDSAPrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = ECDSAPrivateKey(Curve.P256)
    let pemEntry = originalKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 核心演示:从 PEM 字符串解码还原 ECDSA 私钥
    let decodedKey = ECDSAPrivateKey.decodeFromPem(pemString)
    println("从PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从PEM解码成功
解码后密钥类型: ECDSA PRIVATE KEY

static func decodeFromPem(String, ?String)

public static func decodeFromPem(text: String, password!: ?String): ECDSAPrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败、参数密码为空字符串、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = ECDSAPrivateKey(Curve.P256)
    let pemEntry = originalKey.encodeToPem(password: "mypassword")
    let pemString = pemEntry.encode()

    // 核心演示:从加密的 PEM 字符串解码还原 ECDSA 私钥
    let decodedKey = ECDSAPrivateKey.decodeFromPem(pemString, password: "mypassword")
    println("从加密PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从加密PEM解码成功
解码后密钥类型: ECDSA PRIVATE KEY

func encodeToDer()

public override func encodeToDer(): DerBlob

功能:将私钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 Der 格式私钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)
    let derBlob = key.encodeToDer()

    println("编码为DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 121

func encodeToDer(?String)

public func encodeToDer(password!: ?String): DerBlob

功能:使用 AES-256-CBC 加密私钥,将私钥编码为 DER 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • DerBlob - 编码后的 DER 格式私钥。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)
    let derBlob = key.encodeToDer(password: "mypassword")

    println("编码为加密DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为加密DER格式成功
DER数据大小: 239

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将私钥编码为 PEM 格式。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)
    let pemEntry = key.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: EC PRIVATE KEY

func encodeToPem(?String)

public func encodeToPem(password!: ?String): PemEntry

功能:将加密的私钥编码为 PEM 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)
    let pemEntry = key.encodeToPem(password: "mypassword")

    println("编码为加密PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为加密PEM格式成功
PEM标签: ENCRYPTED PRIVATE KEY

func sign(Array<Byte>)

public func sign(digest: Array<Byte>): Array<Byte>

功能:sign 对数据的摘要结果进行签名。

参数:

  • digest: Array<Byte> - 数据的摘要结果。

返回值:

  • Array<Byte> - 签名后的数据。

异常:

示例:

import stdx.crypto.keys.*
import stdx.crypto.digest.*

main() {
    let priKey = ECDSAPrivateKey(Curve.P256)
    let data = "Hello, World!".toArray()

    // 先计算数据的摘要
    let sha256 = SHA256()
    sha256.write(data)
    let digest = sha256.finish()

    let signature = priKey.sign(digest)
    println("签名成功")
    println("签名长度: ${signature.size}")

    return 0
}

可能的运行结果:

签名成功
签名长度: 70

func toString()

public override func toString(): String

功能:输出私钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let key = ECDSAPrivateKey(Curve.P256)

    let keyType = key.toString()
    println("密钥类型: ${keyType}")

    return 0
}

运行结果:

密钥类型: ECDSA PRIVATE KEY

class ECDSAPublicKey

public class ECDSAPublicKey <: PublicKey {
    public init(pri: ECDSAPrivateKey)
}

功能:ECDSA 公钥类,提供生成 ECDSA 公钥能力,ECDSA 公钥支持验证签名操作,支持 PEM 和 DER 格式的编码解码。使用示例见 ECDSA 密钥示例

父类型:

init(ECDSAPrivateKey)

public init(pri: ECDSAPrivateKey)

功能:init 初始化公钥,从私钥中获取对应的公钥。

参数:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = ECDSAPrivateKey(P256)
    // 公钥需要从私钥派生
    let pubKey = ECDSAPublicKey(priKey)

    println("ECDSA公钥创建成功")
    println("公钥类型: ${pubKey}")

    return 0
}

运行结果:

ECDSA公钥创建成功
公钥类型: ECDSA PUBLIC KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): ECDSAPublicKey

功能:将公钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的公钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DER 字节数组
    let priKey = ECDSAPrivateKey(P256)
    let pubKey = ECDSAPublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    // 从 DER 字节数组解码公钥
    let decodedPubKey = ECDSAPublicKey.decodeDer(derBlob)
    println("从DER解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从DER解码公钥成功
解码后公钥类型: ECDSA PUBLIC KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): ECDSAPublicKey

功能:将公钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的公钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、字符流不符合 PEM 格式或文件头不符合公钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let priKey = ECDSAPrivateKey(P256)
    let pubKey = ECDSAPublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 从 PEM 字符串解码公钥
    let decodedPubKey = ECDSAPublicKey.decodeFromPem(pemString)
    println("从PEM解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从PEM解码公钥成功
解码后公钥类型: ECDSA PUBLIC KEY

func encodeToDer()

public override func encodeToDer(): DerBlob

功能:将公钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 Der 格式公钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = ECDSAPrivateKey(P256)
    // 公钥需要从私钥派生
    let pubKey = ECDSAPublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    println("编码为DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 91

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将公钥编码为 PEM 格式。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = ECDSAPrivateKey(P256)
    // 公钥需要从私钥派生
    let pubKey = ECDSAPublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: PUBLIC KEY

func toString()

public override func toString(): String

功能:输出公钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let priKey = ECDSAPrivateKey(P256)
    let pubKey = ECDSAPublicKey(priKey)

    let keyType = pubKey.toString()
    println("公钥类型: ${keyType}")

    return 0
}

运行结果:

公钥类型: ECDSA PUBLIC KEY

func verify(Array<Byte>, Array<Byte>)

public func verify(digest: Array<Byte>, sig: Array<Byte>): Bool

功能:verify 验证签名结果。

参数:

  • digest: Array<Byte> - 数据的摘要结果。
  • sig: Array<Byte> - 数据的签名结果。

返回值:

  • Bool - 返回 true 表示验证成功,false 失败。

示例:

import stdx.crypto.keys.*
import stdx.crypto.digest.*

main() {
    let priKey = ECDSAPrivateKey(P256)
    let pubKey = ECDSAPublicKey(priKey)
    let data = "Hello, World!".toArray()

    // 计算数据摘要
    let sha256 = SHA256()
    sha256.write(data)
    let digest = sha256.finish()

    // 使用私钥签名
    let signature = priKey.sign(digest)

    // 使用公钥验证签名
    let isValid = pubKey.verify(digest, signature)
    println("签名验证结果: ${isValid}")

    // 验证错误的签名
    let wrongData = "Wrong data".toArray()
    sha256.reset()
    sha256.write(wrongData)
    let wrongDigest = sha256.finish()
    let isWrongValid = pubKey.verify(wrongDigest, signature)
    println("错误数据验证结果: ${isWrongValid}")

    return 0
}

运行结果:

签名验证结果: true
错误数据验证结果: false

class GeneralPrivateKey

public class GeneralPrivateKey <: PrivateKey

功能:通用的私钥参数加解密功能实现。

父类型:

static func decodeDer(DerBlob)

static func decodeDer(encoded: DerBlob): PrivateKey

功能:将私钥从 DER 格式解码。

参数:

  • encoded: DerBlob - DER 格式的私钥对象。

返回值:

  • PrivateKey - 由 DER 格式解码出的私钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let privateDer = "./test_private.der"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " +
        "openssl rsa -in ${privatePem} -out ${privateDer} -outform der"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从 DerBlob 解码还原私钥
    let decodedKey = GeneralPrivateKey.decodeDer(DerBlob(readToEnd(File(privateDer, Read))))
    println("解码成功")
    println("解码后密钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(privateDer)
    return 0
}

可能的运行结果:

解码成功
解码后密钥类型: PrivateKey(1217 bytes, RSA 2048 bits)

static func decodeDer(DerBlob, ?String)

static func decodeDer(encoded: DerBlob, password!: ?String): PrivateKey

功能:将 DER 格式的私钥解密解码成 PrivateKey 对象,密码为 None 时则不解密。

参数:

  • encoded: DerBlob - DER 格式的私钥。
  • password!: ?String - 解密密码。

返回值:

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用加密文件
    let privatePem = "./test_private.key"
    let privateDer = "./test_private.der"
    let password = "mypassword"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " +
        "openssl rsa -in ${privatePem} -aes256 -passout pass:${password} -out ${privateDer} -outform der"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从加密的 DerBlob 解码还原私钥
    let decodedKey = GeneralPrivateKey.decodeDer(DerBlob(readToEnd(File(privateDer, Read))), password: password)
    println("解码加密DER成功")
    println("解码后密钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(privateDer)
    return 0
}

可能的运行结果:

解码加密DER成功
解码后密钥类型: PrivateKey(1217 bytes, RSA 2048 bits)

static func decodeFromPem(String)

static func decodeFromPem(text: String): PrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。

返回值:

  • PrivateKey - 由 PEM 格式解码出的私钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从 PEM 字符串解码还原私钥
    let pemContent = String.fromUtf8(readToEnd(File(privatePem, Read)))
    let decodedKey = GeneralPrivateKey.decodeFromPem(pemContent)
    println("从PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    return 0
}

可能的运行结果:

从PEM解码成功
解码后密钥类型: PrivateKey(1217 bytes, RSA 2048 bits)

static func decodeFromPem(String, ?String)

static func decodeFromPem(text: String, password!: ?String): PrivateKey

功能:将 PEM 格式的私钥解密解码成 PrivateKey 对象,密码为 None 时则不解密。

参数:

  • text: String - PEM 格式的私钥。
  • password!: ?String - 解密密码。

返回值:

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用加密文件
    let privatePem = "./test_private.key"
    let password = "mypassword"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genpkey -algorithm rsa -out ${privatePem} -aes256 -pass pass:${password}"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从加密的 PEM 字符串解码还原私钥
    let pemContent = String.fromUtf8(readToEnd(File(privatePem, Read)))
    let decodedKey = GeneralPrivateKey.decodeFromPem(pemContent, password: password)
    println("从加密PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    return 0
}

可能的运行结果:

从加密PEM解码成功
解码后密钥类型: PrivateKey(1217 bytes, RSA 2048 bits)

func encodeToDer()

func encodeToDer(): DerBlob

功能:将私钥编码成 DER 格式。

返回值:

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let privateDer = "./test_private.der"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " +
        "openssl rsa -in ${privatePem} -out ${privateDer} -outform der"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 DER 文件读取并解码为私钥
    let originalKey = GeneralPrivateKey.decodeDer(DerBlob(readToEnd(File(privateDer, Read))))

    // 核心演示:将私钥编码为 DER 格式
    let encodedBlob = originalKey.encodeToDer()
    println("编码为DER格式成功")
    println("DER数据大小: ${encodedBlob.size}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(privateDer)
    return 0
}

可能的运行结果:

编码为DER格式成功
DER数据大小: 1217

func encodeToDer(?String)

func encodeToDer(password!: ?String): DerBlob

功能:将私钥加密编码成 DER 格式,密码为 None 时则不加密。

参数:

  • password!: ?String - 加密密码。

返回值:

  • DerBlob - 加密后的 DER 格式的私钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let privateDer = "./test_private.der"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " +
        "openssl rsa -in ${privatePem} -out ${privateDer} -outform der"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 DER 文件读取并解码为私钥
    let originalKey = GeneralPrivateKey.decodeDer(DerBlob(readToEnd(File(privateDer, Read))))

    // 核心演示:将私钥加密编码为 DER 格式
    let encodedBlob = originalKey.encodeToDer(password: "mypassword")
    println("编码为加密DER格式成功")
    println("DER数据大小: ${encodedBlob.size}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(privateDer)
    return 0
}

可能的运行结果:

编码为加密DER格式成功
DER数据大小: 1354

func encodeToPem()

func encodeToPem(): PemEntry

功能:将私钥编码成 PEM 格式。

返回值:

  • PemEntry - 编码后的 PEM 格式的私钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为私钥
    let pemContent = String.fromUtf8(readToEnd(File(privatePem, Read)))
    let originalKey = GeneralPrivateKey.decodeFromPem(pemContent)

    // 核心演示:将私钥编码为 PEM 格式
    let encodedPem = originalKey.encodeToPem()
    println("编码为PEM格式成功")
    println("PEM标签: ${encodedPem.label}")

    // 删除测试用文件
    removeIfExists(privatePem)
    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: PRIVATE KEY

func encodeToPem(?String)

func encodeToPem(password!: ?String): PemEntry

功能:将私钥加密编码成 PEM 格式,密码为 None 时则不加密。

参数:

  • password!: ?String - 加密密码。

返回值:

  • PemEntry - 加密后的 PEM 格式的私钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为私钥
    let pemContent = String.fromUtf8(readToEnd(File(privatePem, Read)))
    let originalKey = GeneralPrivateKey.decodeFromPem(pemContent)

    // 核心演示:将私钥加密编码为 PEM 格式
    let encodedPem = originalKey.encodeToPem(password: "mypassword")
    println("编码为加密PEM格式成功")
    println("PEM标签: ${encodedPem.label}")

    // 删除测试用文件
    removeIfExists(privatePem)
    return 0
}

运行结果:

编码为加密PEM格式成功
PEM标签: ENCRYPTED PRIVATE KEY

func toString()

public func toString(): String

功能:转换为字符串格式。

返回值:

  • String - 字符串。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为私钥
    let pemContent = String.fromUtf8(readToEnd(File(privatePem, Read)))
    let key = GeneralPrivateKey.decodeFromPem(pemContent)

    // 核心演示:获取私钥类型描述
    let keyType = key.toString()
    println("私钥类型: ${keyType}")

    // 删除测试用文件
    removeIfExists(privatePem)
    return 0
}

可能的运行结果:

私钥类型: PrivateKey(1216 bytes, RSA 2048 bits)

class GeneralPublicKey

public class GeneralPublicKey <: PublicKey

功能:通用的公钥参数加解密功能实现。

父类型:

static func decodeDer(DerBlob)

static func decodeDer(encoded: DerBlob): PublicKey

功能:将公钥从 DER 格式解码。

参数:

  • encoded: DerBlob - DER 格式的公钥对象。

返回值:

  • PublicKey - 由 DER 格式解码出的公钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let publicPem = "./test_public.key"
    let publicDer = "./test_public.der"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " + "openssl rsa -in ${privatePem} -pubout -out ${publicPem}; " +
        "openssl rsa -in ${publicPem} -pubin -out ${publicDer} -outform der"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从 DerBlob 解码还原公钥
    let decodedKey = GeneralPublicKey.decodeDer(DerBlob(readToEnd(File(publicDer, Read))))
    println("解码成功")
    println("解码后公钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(publicPem)
    removeIfExists(publicDer)
    return 0
}

运行结果:

解码成功
解码后公钥类型: PublicKey(294 bytes)

static func decodeFromPem(String)

static func decodeFromPem(text: String): PublicKey

功能:将公钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的公钥字符流。

返回值:

  • PublicKey - 由 PEM 格式解码出的公钥。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let publicPem = "./test_public.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " + "openssl rsa -in ${privatePem} -pubout -out ${publicPem}"

    executeWithOutput("sh", ["-c", cmdStr])

    // 核心演示:从 PEM 字符串解码还原公钥
    let pemContent = String.fromUtf8(readToEnd(File(publicPem, Read)))
    let decodedKey = GeneralPublicKey.decodeFromPem(pemContent)
    println("从PEM解码成功")
    println("解码后公钥类型: ${decodedKey}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(publicPem)
    return 0
}

运行结果:

从PEM解码成功
解码后公钥类型: PublicKey(294 bytes)

func encodeToDer()

func encodeToDer(): DerBlob

功能:将公钥编码成 DER 格式。

返回值:

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*
import stdx.crypto.common.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let publicPem = "./test_public.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " + "openssl rsa -in ${privatePem} -pubout -out ${publicPem}"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为公钥
    let pemContent = String.fromUtf8(readToEnd(File(publicPem, Read)))
    let originalKey = GeneralPublicKey.decodeFromPem(pemContent)

    // 核心演示:将公钥编码为 DER 格式
    let encodedBlob = originalKey.encodeToDer()
    println("编码为DER格式成功")
    println("DER数据大小: ${encodedBlob.size}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(publicPem)
    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 294

func encodeToPem()

func encodeToPem(): PemEntry

功能:将公钥编码为 PEM 格式。

返回值:

  • PemEntry - 公钥数据 PEM 格式编码生成的对象。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let publicPem = "./test_public.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " + "openssl rsa -in ${privatePem} -pubout -out ${publicPem}"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为公钥
    let pemContent = String.fromUtf8(readToEnd(File(publicPem, Read)))
    let originalKey = GeneralPublicKey.decodeFromPem(pemContent)

    // 核心演示:将公钥编码为 PEM 格式
    let encodedPem = originalKey.encodeToPem()
    println("编码为PEM格式成功")
    println("PEM标签: ${encodedPem.label}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(publicPem)
    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: PUBLIC KEY

func toString()

public func toString(): String

功能:转换为字符串格式。

返回值:

  • String - 字符串。

示例:

import std.fs.*
import std.io.*
import std.process.*
import stdx.crypto.keys.*

main() {
    // 生成测试用文件
    let privatePem = "./test_private.key"
    let publicPem = "./test_public.key"

    let cmdStr =
        // OpenSSL 官方标准、无风险的测试用命令
        "openssl genrsa -out ${privatePem} 2048; " + "openssl rsa -in ${privatePem} -pubout -out ${publicPem}"

    executeWithOutput("sh", ["-c", cmdStr])

    // 从 PEM 文件读取并解码为公钥
    let pemContent = String.fromUtf8(readToEnd(File(publicPem, Read)))
    let key = GeneralPublicKey.decodeFromPem(pemContent)

    // 核心演示:获取公钥类型描述
    let keyType = key.toString()
    println("公钥类型: ${keyType}")

    // 删除测试用文件
    removeIfExists(privatePem)
    removeIfExists(publicPem)
    return 0
}

运行结果:

公钥类型: PublicKey(294 bytes)

class RSAPrivateKey

public class RSAPrivateKey <: PrivateKey{
    public init(bits: Int32)
    public init(bits: Int32, e: BigInt)
}

功能:RSA 私钥类,提供生成 RSA 私钥能力,RSA 私钥支持签名和解密操作,支持 PEM 和 DER 格式的编码解码,符合 PKCS1 标准。使用示例见 RSA 密钥示例

父类型:

init(Int32)

public init(bits: Int32)

功能:init 初始化生成私钥,公钥指数默认值为 65537,业界推荐。公钥指数 e 的大小直接影响了 RSA 算法的安全性和加密效率。通常情况下,e 的值越小,加密速度越快,但安全性越低。

参数:

  • bits: Int32 - 密钥长度,需要大于等于 512 位,并且小于等于 16384 位。

异常:

  • CryptoException - 密钥长度不符合要求或初始化失败,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)
    println("RSA私钥创建成功")
    println("密钥类型: ${key}")

    return 0
}

运行结果:

RSA私钥创建成功
密钥类型: RSA PRIVATE KEY

init(Int32, BigInt)

public init(bits: Int32, e: BigInt)

功能:init 初始化生成私钥,允许用户指定公共指数。

参数:

  • bits: Int32 - 密钥长度,需要大于等于 512 位,并且小于等于 16384 位,推荐使用的密钥长度不小于 3072 位。
  • e: BigInt - 公钥公共指数,范围是 [3, 2^256-1] 的奇数。

异常:

  • CryptoException - 密钥长度不符合要求、公钥公共指数值不符合要求或初始化失败,抛出异常。

示例:

import stdx.crypto.keys.*
import std.math.numeric.*

main() {
    let e = BigInt(65537)
    let key = RSAPrivateKey(2048, e)
    println("RSA私钥创建成功")
    println("密钥类型: ${key}")

    return 0
}

运行结果:

RSA私钥创建成功
密钥类型: RSA PRIVATE KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): RSAPrivateKey

功能:将私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = RSAPrivateKey(2048)
    let encodedBlob = originalKey.encodeToDer()

    // 核心演示:从 DerBlob 解码还原 RSA 私钥
    let decodedKey = RSAPrivateKey.decodeDer(encodedBlob)
    println("解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码成功
解码后密钥类型: RSA PRIVATE KEY

static func decodeDer(DerBlob, ?String)

public static func decodeDer(blob: DerBlob, password!: ?String): RSAPrivateKey

功能:将加密的私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = RSAPrivateKey(2048)
    let encodedBlob = originalKey.encodeToDer(password: "mypassword")

    // 核心演示:从加密的 DerBlob 解码还原 RSA 私钥
    let decodedKey = RSAPrivateKey.decodeDer(encodedBlob, password: "mypassword")
    println("解码加密DER成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码加密DER成功
解码后密钥类型: RSA PRIVATE KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): RSAPrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、解密失败、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = RSAPrivateKey(2048)
    let pemEntry = originalKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 核心演示:从 PEM 字符串解码还原 RSA 私钥
    let decodedKey = RSAPrivateKey.decodeFromPem(pemString)
    println("从PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从PEM解码成功
解码后密钥类型: RSA PRIVATE KEY

static func decodeFromPem(String, ?String)

public static func decodeFromPem(text: String, password!: ?String): RSAPrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败、参数密码为空字符串、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = RSAPrivateKey(2048)
    let pemEntry = originalKey.encodeToPem(password: "mypassword")
    let pemString = pemEntry.encode()

    // 核心演示:从加密的 PEM 字符串解码还原 RSA 私钥
    let decodedKey = RSAPrivateKey.decodeFromPem(pemString, password: "mypassword")
    println("从加密PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从加密PEM解码成功
解码后密钥类型: RSA PRIVATE KEY

func decrypt(InputStream, OutputStream, PadOption)

public func decrypt(input: InputStream, output: OutputStream, padType!: PadOption): Unit

功能:decrypt 解密出原始数据。

参数:

  • input: InputStream - 加密的数据。
  • output: OutputStream - 解密后的数据。
  • padType!: PadOption - 填充模式,可以选择 PKCS1 或 OAEP 模式,不支持 PSS 模式,在对安全场景要求较高的情况下,推荐使用 OAEP 填充模式。

异常:

  • CryptoException - 设置填充模式失败或解密失败,抛出异常。

示例:

import stdx.crypto.keys.*
import std.io.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)

    // 准备要加密的数据
    let data = "Hello, World!".toArray()
    let input = ByteBuffer()
    let output = ByteBuffer()
    let decrypted = ByteBuffer()
    input.write(data)

    // 使用公钥加密数据
    pubKey.encrypt(input, output, padType: PKCS1)

    // 使用私钥解密数据
    priKey.decrypt(output, decrypted, padType: PKCS1)

    let result = Array<Byte>(data.size, repeat: 0)
    decrypted.read(result)

    if (data == result) {
        println("解密成功")
    } else {
        println("解密失败")
    }

    return 0
}

运行结果:

解密成功

func encodeToDer()

public override func encodeToDer(): DerBlob

功能:将私钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 DER 格式私钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)
    let derBlob = key.encodeToDer()

    println("编码为DER格式成功")

    return 0
}

运行结果:

编码为DER格式成功

func encodeToDer(?String)

public func encodeToDer(password!: ?String): DerBlob

功能:使用 AES-256-CBC 加密私钥,将私钥编码为 DER 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • DerBlob - 编码后的 DER 格式私钥。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)
    let derBlob = key.encodeToDer(password: "mypassword")

    println("编码为加密DER格式成功")

    return 0
}

运行结果:

编码为加密DER格式成功

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将私钥编码为 PEM 格式。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)
    let pemEntry = key.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: RSA PRIVATE KEY

func encodeToPem(?String)

public func encodeToPem(password!: ?String): PemEntry

功能:将加密的私钥编码为 PEM 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)
    let pemEntry = key.encodeToPem(password: "mypassword")

    println("编码为加密PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为加密PEM格式成功
PEM标签: ENCRYPTED PRIVATE KEY

func sign(Digest, Array<Byte>, PadOption)

public func sign(hash: Digest, digest: Array<Byte>, padType!: PadOption): Array<Byte>

功能:对数据的摘要结果进行签名。

参数:

  • hash: Digest - 摘要方法,获取 digest 结果使用的摘要方法。
  • digest: Array<Byte> - 数据的摘要结果。
  • padType!: PadOption - 填充模式,可以选择 PKCS1 或 PSS 模式,不支持 OAEP 模式,在对安全场景要求较高的情况下,推荐使用 PSS 填充模式。

返回值:

  • Array<Byte> - 签名后的数据。

异常:

  • CryptoException - 设置摘要方法失败、设置填充模式失败或签名失败,抛出异常。

示例:

import stdx.crypto.keys.*
import stdx.crypto.digest.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)
    let data = "Hello, World!".toArray()

    // 先计算数据的摘要
    let sha256 = SHA256()
    sha256.write(data)
    let digest = sha256.finish()

    // 使用私钥签名
    let signature = priKey.sign(sha256, digest, padType: PKCS1)

    // 使用公钥验证签名
    let isValid = pubKey.verify(sha256, digest, signature, padType: PKCS1)

    println("签名验证结果: ${isValid}")

    return 0
}

运行结果:

签名验证结果: true

func toString()

public override func toString(): String

功能:输出私钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let key = RSAPrivateKey(2048)

    let keyType = key.toString()
    println("密钥类型: ${keyType}")

    return 0
}

运行结果:

密钥类型: RSA PRIVATE KEY

class RSAPublicKey

public class RSAPublicKey <: PublicKey {
    public init(pri: RSAPrivateKey)
}

功能:RSA 公钥类,提供生成 RSA 公钥能力,RSA 公钥支持验证签名和加密操作,支持 PEM 和 DER 格式的编码解码。使用示例见 RSA 密钥示例

父类型:

init(RSAPrivateKey)

public init(pri: RSAPrivateKey)

功能:init 初始化公钥,从私钥中获取对应的公钥。

参数:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)

    println("RSA公钥创建成功")
    println("公钥类型: ${pubKey}")

    return 0
}

运行结果:

RSA公钥创建成功
公钥类型: RSA PUBLIC KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): RSAPublicKey

功能:将公钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的公钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DER 字节数组
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    // 从 DER 字节数组解码公钥
    let decodedPubKey = RSAPublicKey.decodeDer(derBlob)
    println("从DER解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从DER解码公钥成功
解码后公钥类型: RSA PUBLIC KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): RSAPublicKey

功能:将公钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的公钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、字符流不符合 PEM 格式或文件头不符合公钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 从 PEM 字符串解码公钥
    let decodedPubKey = RSAPublicKey.decodeFromPem(pemString)
    println("从PEM解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从PEM解码公钥成功
解码后公钥类型: RSA PUBLIC KEY

func encodeToDer()

public override func encodeToDer(): DerBlob

功能:将公钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 Der 格式公钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = RSAPrivateKey(2048)
    // 公钥需要从私钥派生
    let pubKey = RSAPublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    println("编码为DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 294

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将公钥编码为 PEM 格式。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = RSAPrivateKey(2048)
    // 公钥需要从私钥派生
    let pubKey = RSAPublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: PUBLIC KEY

func encrypt(InputStream, OutputStream, PadOption)

public func encrypt(input: InputStream, output: OutputStream, padType!: PadOption): Unit

功能:encrypt 给一段数据进行加密。

参数:

  • input: InputStream - 需要加密的数据。
  • output: OutputStream - 加密后的数据。
  • padType!: PadOption - 填充模式,可以选择 PKCS1 或 OAEP 模式,不支持 PSS 模式,在对安全场景要求较高的情况下,推荐使用 OAEP 填充模式。

异常:

  • CryptoException - 设置填充模式失败或加密失败,抛出异常。

示例:

import stdx.crypto.keys.*
import std.io.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)

    // 准备要加密的数据
    let data = "Hello, World!".toArray()
    let input = ByteBuffer()
    let output = ByteBuffer()
    input.write(data)

    // 使用公钥加密数据
    pubKey.encrypt(input, output, padType: PKCS1)

    println("加密成功")

    return 0
}

运行结果:

加密成功

func toString()

public override func toString(): String

功能:输出公钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)

    let keyType = pubKey.toString()
    println("公钥类型: ${keyType}")

    return 0
}

运行结果:

公钥类型: RSA PUBLIC KEY

func verify(Digest, Array<Byte>, Array<Byte>, PadOption)

public func verify(hash: Digest, digest: Array<Byte>, sig: Array<Byte>, padType!: PadOption): Bool

功能:verify 验证签名结果。

参数:

  • hash: Digest - 摘要方法,获取 digest 结果使用的摘要方法。
  • digest: Array<Byte> - 数据的摘要结果。
  • sig: Array<Byte> - 数据的签名结果。
  • padType!: PadOption - 填充模式,可以选择 PKCS1 或 PSS 模式,不支持 OAEP 模式,在对安全场景要求较高的情况下,推荐使用 PSS 填充模式。

返回值:

  • Bool - 返回 true 表示验证成功,false 失败。

异常:

  • CryptoException - 设置填充模式失败或验证失败,抛出异常。

示例:

import stdx.crypto.keys.*
import stdx.crypto.digest.*

main() {
    let priKey = RSAPrivateKey(2048)
    let pubKey = RSAPublicKey(priKey)
    let data = "Hello, World!".toArray()

    // 计算数据摘要
    let sha256 = SHA256()
    sha256.write(data)
    let digest = sha256.finish()

    // 使用私钥签名
    let signature = priKey.sign(sha256, digest, padType: PKCS1)

    // 使用公钥验证签名
    let isValid = pubKey.verify(sha256, digest, signature, padType: PKCS1)
    println("签名验证结果: ${isValid}")

    // 验证错误的签名
    let wrongData = "Wrong data".toArray()
    sha256.reset()
    sha256.write(wrongData)
    let wrongDigest = sha256.finish()
    let isWrongValid = pubKey.verify(sha256, wrongDigest, signature, padType: PKCS1)
    println("错误数据验证结果: ${isWrongValid}")

    return 0
}

运行结果:

签名验证结果: true
错误数据验证结果: false

class SM2PrivateKey

public class SM2PrivateKey <: PrivateKey {
    public init()
}

功能:SM2 私钥类,提供生成 SM2 私钥能力,SM2 私钥支持签名和解密操作,支持 PEM 和 DER 格式的编码解码,符合 PKCS1 标准。使用示例见 SM2 密钥示例

父类型:

init()

public init()

功能:init 初始化生成私钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()
    println("SM2私钥创建成功")
    println("密钥类型: ${key}")

    return 0
}

运行结果:

SM2私钥创建成功
密钥类型: SM2 PRIVATE KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): SM2PrivateKey

功能:将私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = SM2PrivateKey()
    let encodedBlob = originalKey.encodeToDer()

    // 核心演示:从 DerBlob 解码还原 SM2 私钥
    let decodedKey = SM2PrivateKey.decodeDer(encodedBlob)
    println("解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码成功
解码后密钥类型: SM2 PRIVATE KEY

static func decodeDer(DerBlob, ?String)

public static func decodeDer(blob: DerBlob, password!: ?String): SM2PrivateKey

功能:将加密的私钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的私钥对象。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DerBlob(此处通过生成私钥并编码模拟)
    let originalKey = SM2PrivateKey()
    let encodedBlob = originalKey.encodeToDer(password: "mypassword")

    // 核心演示:从加密的 DerBlob 解码还原 SM2 私钥
    let decodedKey = SM2PrivateKey.decodeDer(encodedBlob, password: "mypassword")
    println("解码加密DER成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

解码加密DER成功
解码后密钥类型: SM2 PRIVATE KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): SM2PrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、解密失败、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = SM2PrivateKey()
    let pemEntry = originalKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 核心演示:从 PEM 字符串解码还原 SM2 私钥
    let decodedKey = SM2PrivateKey.decodeFromPem(pemString)
    println("从PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从PEM解码成功
解码后密钥类型: SM2 PRIVATE KEY

static func decodeFromPem(String, ?String)

public static func decodeFromPem(text: String, password!: ?String): SM2PrivateKey

功能:将私钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的私钥字符流。
  • password!: ?String - 解密私钥需要提供的密码,密码为 None 时则不解密。

返回值:

异常:

  • CryptoException - 解码失败、解密失败、参数密码为空字符串、字符流不符合 PEM 格式或文件头不符合私钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let originalKey = SM2PrivateKey()
    let pemEntry = originalKey.encodeToPem(password: "mypassword")
    let pemString = pemEntry.encode()

    // 核心演示:从加密的 PEM 字符串解码还原 SM2 私钥
    let decodedKey = SM2PrivateKey.decodeFromPem(pemString, password: "mypassword")
    println("从加密PEM解码成功")
    println("解码后密钥类型: ${decodedKey}")

    return 0
}

运行结果:

从加密PEM解码成功
解码后密钥类型: SM2 PRIVATE KEY

func decrypt(Array<Byte>)

public func decrypt(input: Array<Byte>): Array<Byte>

功能:decrypt 解密出原始数据,待解密密文需要遵循 ASN.1 编码规则。

参数:

  • input: Array<Byte> - 加密的数据。

返回值:

  • Array<Byte> - 解密后的数据。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)

    // 准备要加密的数据
    let data = "Hello, World!".toArray()

    // 使用公钥加密数据
    let encryptedData = pubKey.encrypt(data)

    // 使用私钥解密数据
    let decryptedData = priKey.decrypt(encryptedData)

    let result = String.fromUtf8(decryptedData)
    println("解密结果: ${result}")

    return 0
}

运行结果:

解密结果: Hello, World!

func encodeToDer()

public func encodeToDer(): DerBlob

功能:将私钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 DER 格式私钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()
    let derBlob = key.encodeToDer()

    println("编码为DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 121

func encodeToDer(?String)

public func encodeToDer(password!: ?String): DerBlob

功能:使用 AES-256-CBC 加密私钥,将私钥编码为 DER 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • DerBlob - 编码后的 DER 格式公钥。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()
    let derBlob = key.encodeToDer(password: "mypassword")

    println("编码为加密DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为加密DER格式成功
DER数据大小: 239

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将私钥编码为 PEM 格式。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()
    let pemEntry = key.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: EC PRIVATE KEY

func encodeToPem(?String)

public func encodeToPem(password!: ?String): PemEntry

功能:将加密的私钥编码为 PEM 格式。

参数:

  • password!: ?String - 加密私钥需要提供的密码,密码为 None 时则不加密。

返回值:

  • PemEntry - 私钥 PEM 格式的对象。

异常:

  • CryptoException - 编码失败、加密失败或者参数密码为空字符串,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()
    let pemEntry = key.encodeToPem(password: "mypassword")

    println("编码为加密PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为加密PEM格式成功
PEM标签: EC PRIVATE KEY

func sign(Array<Byte>)

public func sign(data: Array<Byte>): Array<Byte>

功能:sign 对数据进行签名,SM2 采用SM3数据摘要算法。

参数:

  • data: Array<Byte> - 数据。

返回值:

  • Array<Byte> - 签名后的数据。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)
    let data = "Hello, World!".toArray()

    // 使用私钥签名,直接传原始数据,内部自动算 SM3
    let signature = priKey.sign(data)

    // 使用公钥验证签名
    let isValid = pubKey.verify(data, signature)

    println("签名验证结果: ${isValid}")

    return 0
}

运行结果:

签名验证结果: true

func toString()

public override func toString(): String

功能:输出私钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let key = SM2PrivateKey()

    let keyType = key.toString()
    println("密钥类型: ${keyType}")

    return 0
}

运行结果:

密钥类型: SM2 PRIVATE KEY

class SM2PublicKey

public class SM2PublicKey <: PublicKey {
    public init(pri: SM2PrivateKey)
}

功能:SM2 公钥类,提供生成 SM2 公钥能力,SM2 公钥支持验证签名和加密操作,支持 PEM 和 DER 格式的编码解码。使用示例见 SM2 密钥示例

父类型:

init(SM2PrivateKey)

public init(pri: SM2PrivateKey)

功能:init 初始化公钥,从私钥中获取对应的公钥。

参数:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)

    println("SM2公钥创建成功")
    println("公钥类型: ${pubKey}")

    return 0
}

运行结果:

SM2公钥创建成功
公钥类型: SM2 PUBLIC KEY

static func decodeDer(DerBlob)

public static func decodeDer(blob: DerBlob): SM2PublicKey

功能:将公钥从 DER 格式解码。

参数:

  • blob: DerBlob - 二进制格式的公钥对象。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 DER 字节数组
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    // 从 DER 字节数组解码公钥
    let decodedPubKey = SM2PublicKey.decodeDer(derBlob)
    println("从DER解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从DER解码公钥成功
解码后公钥类型: SM2 PUBLIC KEY

static func decodeFromPem(String)

public static func decodeFromPem(text: String): SM2PublicKey

功能:将公钥从 PEM 格式解码。

参数:

  • text: String - PEM 格式的公钥字符流。

返回值:

异常:

  • CryptoException - 解码失败、字符流不符合 PEM 格式或文件头不符合公钥头标准时,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    // 模拟场景:从外部(文件/网络)获取的 PEM 字符串
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()
    let pemString = pemEntry.encode()

    // 从 PEM 字符串解码公钥
    let decodedPubKey = SM2PublicKey.decodeFromPem(pemString)
    println("从PEM解码公钥成功")
    println("解码后公钥类型: ${decodedPubKey}")

    return 0
}

运行结果:

从PEM解码公钥成功
解码后公钥类型: SM2 PUBLIC KEY

func encodeToDer()

public func encodeToDer(): DerBlob

功能:将公钥编码为 DER 格式。

返回值:

  • DerBlob - 编码后的 Der 格式公钥。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    // 公钥需要从私钥派生
    let pubKey = SM2PublicKey(priKey)
    let derBlob = pubKey.encodeToDer()

    println("编码为DER格式成功")
    println("DER数据大小: ${derBlob.size}")

    return 0
}

运行结果:

编码为DER格式成功
DER数据大小: 92

func encodeToPem()

public func encodeToPem(): PemEntry

功能:将公钥编码为 PEM 格式。

返回值:

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    // 公钥需要从私钥派生
    let pubKey = SM2PublicKey(priKey)
    let pemEntry = pubKey.encodeToPem()

    println("编码为PEM格式成功")
    println("PEM标签: ${pemEntry.label}")

    return 0
}

运行结果:

编码为PEM格式成功
PEM标签: PUBLIC KEY

func encrypt(Array<Byte>)

public func encrypt(input: Array<Byte>): Array<Byte>

功能:encrypt 给一段数据进行加密,输出密文遵循 ASN.1 编码规则。

参数:

  • input: Array<Byte> - 需要加密的数据。

返回值:

  • Array<Byte> - 加密后的数据。

异常:

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)

    // 准备要加密的数据
    let data = "Hello, World!".toArray()

    // 使用公钥加密数据
    let encryptedData = pubKey.encrypt(data)

    println("加密成功")
    println("加密后数据大小: ${encryptedData.size}")

    return 0
}

可能的运行结果:

加密成功
加密后数据大小: 121

func toString()

public override func toString(): String

功能:输出公钥种类。

返回值:

  • String - 密钥类别描述。

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)

    let keyType = pubKey.toString()
    println("公钥类型: ${keyType}")

    return 0
}

运行结果:

公钥类型: SM2 PUBLIC KEY

func verify(Array<Byte>, Array<Byte>)

public func verify(data: Array<Byte>, sig: Array<Byte>): Bool

功能:verify 验证签名结果。

参数:

  • data: Array<Byte> - 数据。
  • sig: Array<Byte> - 数据的签名结果。

返回值:

  • Bool - 返回 true 表示验证成功,false 失败。

异常:

  • CryptoException - 设置填充模式失败或验证失败,抛出异常。

示例:

import stdx.crypto.keys.*

main() {
    let priKey = SM2PrivateKey()
    let pubKey = SM2PublicKey(priKey)
    let data = "Hello, World!".toArray()

    // 使用私钥签名
    let signature = priKey.sign(data)

    // 使用公钥验证签名
    let isValid = pubKey.verify(data, signature)

    println("签名验证结果: ${isValid}")

    // 验证错误的签名
    let wrongData = "Wrong data".toArray()
    let isWrongValid = pubKey.verify(wrongData, signature)
    println("错误数据验证结果: ${isWrongValid}")

    return 0
}

运行结果:

签名验证结果: true
错误数据验证结果: false