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...
AESContext
继承: RefCounted < Object
提供对原始数据的 AES 加密/解密的访问。
描述
这个类存放的是进行 AES(Advanced Encryption Standard,高级加密标准)加解密所需的上下文信息。支持 AES-ECB 和 AES-CBC 两种模式。
extends Node
var aes = AESContext.new()
func _ready():
var key = "My secret key!!!" # 密钥必须是 16 或 32 字节。
var data = "My secret text!!" # 数据大小必须是 16 字节的倍数,需要时添加补白。
# ECB 加密
aes.start(AESContext.MODE_ECB_ENCRYPT, key.to_utf8_buffer())
var encrypted = aes.update(data.to_utf8_buffer())
aes.finish()
# ECB 解密
aes.start(AESContext.MODE_ECB_DECRYPT, key.to_utf8_buffer())
var decrypted = aes.update(encrypted)
aes.finish()
# ECB 校验
assert(decrypted == data.to_utf8_buffer())
var iv = "My secret iv!!!!" # IV 必须是 16 字节。
# CBC 加密
aes.start(AESContext.MODE_CBC_ENCRYPT, key.to_utf8_buffer(), iv.to_utf8_buffer())
encrypted = aes.update(data.to_utf8_buffer())
aes.finish()
# CBC 解密
aes.start(AESContext.MODE_CBC_DECRYPT, key.to_utf8_buffer(), iv.to_utf8_buffer())
decrypted = aes.update(encrypted)
aes.finish()
# CBC 校验
assert(decrypted == data.to_utf8_buffer())
using Godot;
using System.Diagnostics;
public partial class MyNode : Node
{
private AesContext _aes = new AesContext();
public override void _Ready()
{
string key = "My secret key!!!"; // 密钥必须是 16 或 32 字节。
string data = "My secret text!!"; // 数据大小必须是 16 字节的倍数,需要时添加补白。
// ECB 加密
_aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8Buffer());
byte[] encrypted = _aes.Update(data.ToUtf8Buffer());
_aes.Finish();
// ECB 解密
_aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8Buffer());
byte[] decrypted = _aes.Update(encrypted);
_aes.Finish();
// ECB 校验
Debug.Assert(decrypted == data.ToUtf8Buffer());
string iv = "My secret iv!!!!"; // IV 必须是 16 字节。
// CBC 加密
_aes.Start(AesContext.Mode.EcbEncrypt, key.ToUtf8Buffer(), iv.ToUtf8Buffer());
encrypted = _aes.Update(data.ToUtf8Buffer());
_aes.Finish();
// CBC 解密
_aes.Start(AesContext.Mode.EcbDecrypt, key.ToUtf8Buffer(), iv.ToUtf8Buffer());
decrypted = _aes.Update(encrypted);
_aes.Finish();
// CBC 校验
Debug.Assert(decrypted == data.ToUtf8Buffer());
}
}
方法
void |
finish() |
start(mode: Mode, key: PackedByteArray, iv: PackedByteArray = PackedByteArray()) |
|
update(src: PackedByteArray) |
枚举
enum Mode: 🔗
Mode MODE_ECB_ENCRYPT = 0
AES 电子密码簿加密模式。
Mode MODE_ECB_DECRYPT = 1
AES 电子密码簿解密模式。
Mode MODE_CBC_ENCRYPT = 2
AES 密码封锁器链式加密模式。
Mode MODE_CBC_DECRYPT = 3
AES 密码封锁器链式解密模式。
Mode MODE_MAX = 4
模式列举的最大值。
方法说明
void finish() 🔗
关闭此 AES 上下文,以便可以再次启动它。见 start()。
PackedByteArray get_iv_state() 🔗
获取此上下文的当前 IV 状态(调用 update() 时会更新 IV)。通常不需要此函数。
注意:仅当上下文以 MODE_CBC_ENCRYPT 或 MODE_CBC_DECRYPT 开头时,此函数才有意义。
Error start(mode: Mode, key: PackedByteArray, iv: PackedByteArray = PackedByteArray()) 🔗
在给定的 mode
中启动 AES 上下文。必须始终提供 16 或 32 字节的 key
,而仅当 mode
为 MODE_CBC_ENCRYPT 或 MODE_CBC_DECRYPT 时,才需要正好为 16 字节的 iv
(初始化向量)。
PackedByteArray update(src: PackedByteArray) 🔗
运行此 AES 上下文所需的操作。将返回包含加密(或解密)给定 src
结果的 PackedByteArray 。有关操作模式,请参阅 start()。
注意:src
的大小必须是 16 倍的倍数。如果需要,应用一些填充。