这个文件名是历史遗留名称,真实的 Lua 组件名是 data。
数据卡组件提供哈希、编码、压缩、加密、安全随机数以及椭圆曲线密钥运算功能。不同等级的数据卡可用接口不同。
- 仓库:
opencomputers - 实际 Lua 组件名:
data - 对应实现:
li.cil.oc.server.component.DataCard - 常见宿主:安装了数据卡的电脑、服务器或其他设备
getLimitencode64decode64deflateinflatecrc32md5sha256decodeNBT
额外增加:
md5的 HMAC 用法sha256的 HMAC 用法encryptdecryptrandom
额外增加:
generateKeyPairdeserializeKeyecdhecdsa
很多接口返回的是原始二进制数据,不是可直接阅读的文本。
典型例子包括:
- 哈希结果
- AES 密文
- 随机字节
- 序列化后的密钥
- ECDSA 签名
如果你要把这些结果输出、保存或通过文本协议传输,通常应该先用 encode64() 做 Base64 编码。
getLimit() 返回数据卡字节处理接口允许接收的硬上限。
- 如果第一个字符串或字节参数超过这个限制,会直接抛出
data size limit exceeded。 - 如果输入虽然没超过硬上限,但超过软上限,当前计算机会额外暂停一段配置好的时间。
所有接口都会消耗连接器缓冲能量。
- 如果宿主能量不足,接口会失败并报出
not enough energy。
- 语法:
data.getLimit() - 返回:
number - 用途:返回数据卡字节处理接口允许接受的最大字节数。
- 语法:
data.encode64(bytes) - 参数:
bytes:string:原始二进制或普通文本。
- 返回:
string - 用途:对输入数据执行 Base64 编码。
- 语法:
data.decode64(text) - 参数:
text:string:Base64 文本。
- 返回:
string - 用途:把 Base64 文本解码回原始字节。
- 语法:
data.deflate(bytes) - 参数:
bytes:string:原始输入数据。
- 返回:
string - 用途:使用 deflate 格式压缩数据。
- 语法:
data.inflate(bytes) - 参数:
bytes:string:deflate 压缩后的二进制数据。
- 返回:
string - 用途:解压 deflate 格式数据。
- 语法:
data.crc32(bytes) - 参数:
bytes:string
- 返回:
string - 用途:计算输入数据的 CRC-32 摘要。
返回值是 4 字节的二进制摘要,不是十六进制文本。
- 语法:
data.md5(bytes)data.md5(bytes, hmacKey)
- 参数:
bytes:stringhmacKey:string:可选,HMAC 密钥,仅 T2 及以上支持。
- 返回:
string - 用途:计算普通 MD5 或 HMAC-MD5 摘要。
说明:
- 普通 MD5 在 T1 就可用。
- HMAC 形式需要 T2 或更高等级。
- 返回值是二进制数据。
- 语法:
data.sha256(bytes)data.sha256(bytes, hmacKey)
- 参数:
bytes:stringhmacKey:string:可选,HMAC 密钥,仅 T2 及以上支持。
- 返回:
string - 用途:计算普通 SHA-256 或 HMAC-SHA256 摘要。
返回值是二进制数据。
- 语法:
data.decodeNBT(bytes) - 参数:
bytes:string:gzip 压缩过的二进制 NBT 数据。
- 返回:
table - 用途:把压缩的二进制 NBT 数据解码为 Lua 表结构。
这个接口很适合用来检查 Minecraft 的序列化数据块。
- 语法:
data.encrypt(bytes, key, iv) - 参数:
bytes:string:明文数据。key:string:必须正好 16 字节。iv:string:必须正好 16 字节。
- 返回:
string - 用途:使用
AES/CBC/PKCS5Padding加密数据。
失败情况:
- 密钥长度错误:
expected a 128-bit AES key - IV 长度错误:
expected a 128-bit AES IV
返回值是二进制密文。
- 语法:
data.decrypt(bytes, key, iv) - 参数:
bytes:string:密文。key:string:必须正好 16 字节。iv:string:必须正好 16 字节。
- 返回:
string - 用途:解密
AES/CBC/PKCS5Padding格式的密文。
返回值是原始明文字节。
- 语法:
data.random(length) - 参数:
length:number:要生成的随机字节数。
- 返回:
string - 用途:生成密码学安全的随机字节序列。
合法范围:
1到1024
非法长度会抛出:
length must be in range [1..1024]
- 语法:
data.generateKeyPair([bitLen]) - 参数:
bitLen:number:可选,只能是256或384,默认384。
- 返回:
userdata, userdata - 用途:生成一对椭圆曲线公钥和私钥。
返回顺序:
- 第一个返回值:公钥
userdata - 第二个返回值:私钥
userdata
非法位数会抛出:
invalid key length, must be 256 or 384
- 语法:
data.deserializeKey(bytes, typeName) - 参数:
bytes:string:序列化后的密钥字节。typeName:string:ec-public或ec-private。
- 返回:
userdata - 用途:根据序列化字节恢复一个 EC 密钥对象。
非法类型名会抛出:
invalid key type, must be ec-public or ec-private
- 语法:
data.ecdh(privateKey, publicKey) - 参数:
privateKey:userdata:EC 私钥对象。publicKey:userdata:EC 公钥对象。
- 返回:
string - 用途:用 ECDH 派生共享密钥。
返回值是原始二进制共享密钥。
参数类型不匹配时会抛出类似错误:
private key expected at 1public key expected at 2
- 语法:
data.ecdsa(bytes, privateKey)data.ecdsa(bytes, publicKey, signature)
- 参数:
bytes:string:消息字节。privateKey:userdata:签名模式下使用。publicKey:userdata:验签模式下使用。signature:string:要验证的二进制签名。
- 返回:
- 签名模式:
string - 验签模式:
boolean
- 签名模式:
- 用途:使用
SHA256withECDSA对数据签名或验签。
行为说明:
- 不传
signature时,执行签名并返回二进制签名。 - 传入
signature时,执行验签并返回true或false。
generateKeyPair() 和 deserializeKey() 返回的密钥对象本身还带有以下方法。
- 语法:
key.isPublic() - 返回:
boolean - 用途:判断这个密钥对象是不是公钥。
- 语法:
key.keyType() - 返回:
string - 用途:返回
ec-public或ec-private。
- 语法:
key.serialize() - 返回:
string - 用途:返回该密钥的编码后二进制形式。
如果你要安全地保存或打印它,建议再用 data.encode64() 包一层。
local component = require("component")
local data = component.data
local digest = data.sha256("hello world")
print("sha256(base64):", data.encode64(digest))
local publicKey, privateKey = data.generateKeyPair(256)
local signature = data.ecdsa("message", privateKey)
print("签名验证结果:", data.ecdsa("message", publicKey, signature))
local secret = data.random(16)
local iv = data.random(16)
local cipher = data.encrypt("secret text", secret, iv)
print("cipher(base64):", data.encode64(cipher))
print("plain:", data.decrypt(cipher, secret, iv))databaseinternet