Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Crypto¶
继承: RefCounted < Object
提供对高阶加密功能的访问。
描述¶
Crypto 类提供对高阶加密功能的访问。
目前,包括非对称密钥的加密/解密和签名/验证、生成加密安全随机字节、RSA 密钥、HMAC 摘要以及自签名的 X509Certificate。
var crypto = Crypto.new()
# 生成新的 RSA 密钥。
var key = crypto.generate_rsa(4096)
# 使用给定的密钥生成新的自签名证书。
var cert = crypto.generate_self_signed_certificate(key, "CN=mydomain.com,O=My Game Company,C=IT")
# 将密钥和证书保存在用户文件夹中。
key.save("user://generated.key")
cert.save("user://generated.crt")
# 加密
var data = "Some data"
var encrypted = crypto.encrypt(key, data.to_utf8_buffer())
# 解密
var decrypted = crypto.decrypt(key, encrypted)
# 签名
var signature = crypto.sign(HashingContext.HASH_SHA256, data.sha256_buffer(), key)
# 验证
var verified = crypto.verify(HashingContext.HASH_SHA256, data.sha256_buffer(), signature, key)
# 校验
assert(verified)
assert(data.to_utf8_buffer() == decrypted)
using Godot;
using System.Diagnostics;
Crypto crypto = new Crypto();
// 生成新的 RSA 密钥。
CryptoKey key = crypto.GenerateRsa(4096);
// 使用给定的密钥生成新的自签名证书。
X509Certificate cert = crypto.GenerateSelfSignedCertificate(key, "CN=mydomain.com,O=My Game Company,C=IT");
// 将密钥和证书保存在用户文件夹中。
key.Save("user://generated.key");
cert.Save("user://generated.crt");
// 加密
string data = "Some data";
byte[] encrypted = crypto.Encrypt(key, data.ToUtf8Buffer());
// 解密
byte[] decrypted = crypto.Decrypt(key, encrypted);
// 签名
byte[] signature = crypto.Sign(HashingContext.HashType.Sha256, Data.Sha256Buffer(), key);
// 验证
bool verified = crypto.Verify(HashingContext.HashType.Sha256, Data.Sha256Buffer(), signature, key);
// 校验
Debug.Assert(verified);
Debug.Assert(data.ToUtf8Buffer() == decrypted);
方法¶
constant_time_compare(trusted: PackedByteArray, received: PackedByteArray) |
|
decrypt(key: CryptoKey, ciphertext: PackedByteArray) |
|
encrypt(key: CryptoKey, plaintext: PackedByteArray) |
|
generate_random_bytes(size: int) |
|
generate_rsa(size: int) |
|
generate_self_signed_certificate(key: CryptoKey, issuer_name: String = "CN=myserver,O=myorganisation,C=IT", not_before: String = "20140101000000", not_after: String = "20340101000000") |
|
hmac_digest(hash_type: HashType, key: PackedByteArray, msg: PackedByteArray) |
|
sign(hash_type: HashType, hash: PackedByteArray, key: CryptoKey) |
|
verify(hash_type: HashType, hash: PackedByteArray, signature: PackedByteArray, key: CryptoKey) |
方法说明¶
bool constant_time_compare(trusted: PackedByteArray, received: PackedByteArray) 🔗
比较两个 PackedByteArray 是否相等,不会泄漏时序信息,能够防止时序攻击。
详情见这篇博文。
PackedByteArray decrypt(key: CryptoKey, ciphertext: PackedByteArray) 🔗
用提供的私钥 key
解密给定的密文 ciphertext
。
注意:所接受的密文的最大尺寸受到密钥大小的限制。
PackedByteArray encrypt(key: CryptoKey, plaintext: PackedByteArray) 🔗
用提供的公钥 key
加密给定的明文 plaintext
。
注意:所接受的明文的最大尺寸受到密钥大小的限制。
PackedByteArray generate_random_bytes(size: int) 🔗
生成具有给定大小 size
的加密安全随机字节的 PackedByteArray。
CryptoKey generate_rsa(size: int) 🔗
生成可用于创建自签名证书并传递给 StreamPeerTLS.accept_stream 的 RSA CryptoKey。
X509Certificate generate_self_signed_certificate(key: CryptoKey, issuer_name: String = "CN=myserver,O=myorganisation,C=IT", not_before: String = "20140101000000", not_after: String = "20340101000000") 🔗
根据给定的 CryptoKey 和 issuer_name
生成自签名的 X509Certificate。证书有效性将由 not_before
和 not_after
(第一个有效日期和最后一个有效日期)定义。issuer_name
必须至少包含“CN=”(通用名称,即域名)、“O=”(组织,即你的公司名称)、“C=”(国家,即 2 个字母的该组织所在的国家/地区的 ISO-3166 代码)。
生成 RSA 密钥和 X509 自签名证书的小示例。
var crypto = Crypto.new()
# 生成 4096 比特 RSA 密钥。
var key = crypto.generate_rsa(4096)
# 使用给定的密钥生成自签名证书。
var cert = crypto.generate_self_signed_certificate(key, "CN=example.com,O=A Game Company,C=IT")
var crypto = new Crypto();
// 生成 4096 比特 RSA 密钥。
CryptoKey key = crypto.GenerateRsa(4096);
// 使用给定的密钥生成自签名证书。
X509Certificate cert = crypto.GenerateSelfSignedCertificate(key, "CN=mydomain.com,O=My Game Company,C=IT");
PackedByteArray hmac_digest(hash_type: HashType, key: PackedByteArray, msg: PackedByteArray) 🔗
使用密钥 key
生成 msg
的 HMAC 摘要。hash_type
参数是用于内部和外部哈希的哈希算法。
目前仅支持 HashingContext.HASH_SHA256 和 HashingContext.HASH_SHA1。
PackedByteArray sign(hash_type: HashType, hash: PackedByteArray, key: CryptoKey) 🔗
使用提供的私钥 key
对类型为 hash_type
的给定 hash
进行签名。
bool verify(hash_type: HashType, hash: PackedByteArray, signature: PackedByteArray, key: CryptoKey) 🔗
使用提供的公钥 key
验证类型为 hash_type
的给定签名 signature
。