crypto
简介
基于openssl libcrypto封装的密码算法库
组件接口
ec.gs
hashes.gs
函数原型 | 函数作用 |
---|---|
void update(Hash self, buffer data) | 更新哈希对象 |
Hash copy(Hash self) | 返回哈希对象的副本 |
buffer digest(Hash self) | 返回数据摘要 |
int MD4() | 返回md4哈希算法 |
int MD5() | 返回md5哈希算法 |
int MD5_SHA1() | 返回md5_sha1哈希算法 |
int SHA1() | 返回sha-1哈希算法 |
int SHA224() | 返回sha-224哈希算法 |
int SHA256() | 返回sha-256哈希算法 |
int SHA384() | 返回sha-384哈希算法 |
int SHA512() | 返回sha-512哈希算法 |
int SHA512_224() | 返回sha-512/224哈希算法 |
int SHA512_256() | 返回sha-512/256哈希算法 |
int SHA3_224() | 返回sha3-224哈希算法 |
int SHA3_256() | 返回sha3-256哈希算法 |
int SHA3_384() | 返回sha3-384哈希算法 |
int SHA3_512() | 返回sha3-512哈希算法 |
int SM3() | 返回sm3哈希算法(国密哈希) |
hmac.gs
函数原型 | 函数作用 |
---|---|
void update(HMAC self, buffer data) | 用data来更新HMAC对象。m.update(a); m.update(b); 等价于m.update(a + b); |
HMAC copy(HMAC self) | 返回HMAC对象的副本。(可被用来高效地计算共享相同前缀的数据的摘要) |
buffer digest(HMAC self) | 返回当前已传给update()方法的字节串数据的摘要。 |
HMAC new(buffer key, int md) | 返回一个新的HMAC对象。 |
ECPrivateKey.gs
函数原型 | 函数作用 |
---|---|
object public_key() | 提取公钥 |
buffer sign(buffer data) | 签名 |
ECPublicKey.gs
函数原型 | 函数作用 |
---|---|
bool verify(buffer signature, buffer data) | 验签 |
Hash.gs
函数原型 | 函数作用 |
---|---|
void update(buffer data) | 更新哈希对象 |
object copy() | 返回哈希对象的副本 |
buffer digest() | 返回数据摘要 |
HMAC.gs
函数原型 | 函数作用 |
---|---|
void update(buffer data) | 用data来更新HMAC对象。m.update(a); m.update(b); 等价于m.update(a + b); |
object copy() | 返回HMAC对象的副本。(可被用来高效地计算共享相同前缀的数据的摘要) |
buffer digest() | 返回当前已传给update()方法的字节串数据的摘要。 |
RSAPrivateKey.gs
函数原型 | 函数作用 |
---|---|
object public_key() | 提取公钥 |
buffer private_bytes() | 私钥序列化 |
buffer decrypt(buffer ciphertext, enum RSAPadding pad_mode) | 解密 |
buffer sign(buffer data, int type) | 签名 |
RSAPublicKey.gs
函数原型 | 函数作用 |
---|---|
buffer public_bytes() | 公钥序列化 |
buffer encrypt(buffer plaintext, enum RSAPadding pad_mode) | 加密 |
bool verify(buffer signature, buffer data, int type) | 验签 |
rsa.gs
枚举
Curve
prime192v1 = 409,
prime256v1 = 415,
secp224r1 = 713,
secp256k1 = 714,
secp384r1 = 715,
secp521r1 = 716,
sect163k1 = 721,
sect163r2 = 723,
sect233k1 = 726,
sect233r1 = 727,
sect283k1 = 729,
sect283r1 = 730,
sect409k1 = 731,
sect409r1 = 732,
sect571k1 = 733,
sect571r1 = 734,
brainpoolP256r1 = 927,
brainpoolP384r1 = 931,
brainpoolP512r1 = 933,
RSAPadding
RSA_PKCS1_PADDING = 1,
RSA_SSLV23_PADDING = 2,
RSA_NO_PADDING = 3,
RSA_PKCS1_OAEP_PADDING = 4,
RSA_X931_PADDING = 5,
RSA_PKCS1_PSS_PADDING = 6,
样例
import gs.lang.buffer;
import pkg.crypto;
import pkg.crypto.hashes;
import pkg.crypto.hmac;
import pkg.crypto.Padding;
import pkg.crypto.rsa;
public void sample()
{
load_static(crypto);
/**
* 1. Hash
*/
// 创建MD5哈希对象(有多种可选的哈希算法)
mixed md5 = hashes.new(hashes.MD5());
// 针对缓冲区中的字节数据计算摘要(可分批读取数据,反复调用该函数来计算摘要)
md5.update((buffer)"Hello, world!");
// 获取摘要
buffer digest = md5.digest();
printf("digest: %O\n", digest);
printf("hexdigest: %s\n", digest.to_hex());
// 创建SHA256哈希对象
mixed sha256 = hashes.new(hashes.SHA256());
sha256.update((buffer)"Hello,");
printf("hexdigest (part): %s\n", sha256.digest().to_hex());
sha256.update((buffer)" world!");
printf("hexdigest (full): %s\n", sha256.digest().to_hex());
/**
* 2. HMAC
*/
mixed hmac_md5 = hmac.new((buffer)"secret", hashes.MD5());
hmac_md5.update((buffer)"Hello, world!");
printf("hmac: %s\n", hmac_md5.digest().to_hex());
hmac_md5 = hmac.new((buffer)"secret", hashes.MD5());
hmac_md5.update((buffer)"Hello,");
printf("hmac (part): %s\n", hmac_md5.digest().to_hex());
hmac_md5.update((buffer)" world!");
printf("hmac (full): %s\n", hmac_md5.digest().to_hex());
/**
* 3. RSA
*/
// 生成私钥
mixed pri_key = rsa.generate_private_key(1024);
// 私钥序列化
#if 0
file.write_all("/key.pem", pri_key.private_bytes());
#else
printf("%s\n", (string)pri_key.private_bytes());
#endif
// 提取公钥
mixed pub_key = pri_key.public_key();
// 公钥序列化
#if 0
file.write_all("/pub_key.pem", pub_key.public_bytes());
#else
printf("%s\n", (string)pub_key.public_bytes());
#endif
// 公钥加密
buffer ciphertext = pub_key.encrypt((buffer)"Hello, world!", RSAPadding.RSA_PKCS1_OAEP_PADDING);
printf("Encrypted: %O\n", ciphertext);
// 私钥解密
string plaintext = (string)pri_key.decrypt(ciphertext, RSAPadding.RSA_PKCS1_OAEP_PADDING);
printf("Decrypted: %O\n", plaintext);
// $ openssl genrsa -out key.pem 1024
// $ openssl rsa -in key.pem -pubout -out pub_key.pem
// 读取私钥
pri_key = rsa.load_pem_private_key(file.read_all("/key.pem", "b"));
// 读取公钥
pub_key = rsa.load_pem_public_key(file.read_all("/pub_key.pem", "b"));
// 私钥签名
buffer sig = pri_key.sign((buffer)"A message I want to sign", hashes.SHA256());
printf("Signature: %O\n", sig);
// 公钥验签
printf("Verify: %O\n", pub_key.verify(sig, (buffer)"A message I want to sign", hashes.SHA256()));
// 公钥验签(已篡改)
printf("Verify: %O\n", pub_key.verify(sig, (buffer)"A message i want to sign", hashes.SHA256()));
}