@starryn/crypto
Version:
basic crypto base on openssl 3.3.2
195 lines (141 loc) • 5.01 kB
Markdown
# @starryn/crypto
a lightweight crypto library base on [openssl 3.3.2](https://openssl-library.org/) and [emscripten 3.1.64](https://emscripten.org/). refactor some api from [@linker-design/crypto](https://www.npmjs.com/package/@linker-design/crypto).
## features
+ Symmetric encryption
1. AES
2. SM4
+ Asymmetric encryption
1. RSA
2. SM2
+ Message Digest
1. Md5
2. Md5Sha1
3. Sha1
4. Sha256
5. Sha384
6. Sha512
7. SM3
## usage
follow is some basic usage.
### Symmetric encryption
```typescript
import { Aes, SM4 } from '@starryn/crypto'
const testAesNeat = async () => {
const str = '一襟晚照淡风云,半船蝉音半梵心。江月吟尽古今事,白首偶趣三千经'
const key = await Aes.keyAsync(256)
const iv = await Aes.ivAsync(16)
const eRes = await Aes.encryptAsync(str, key, iv)
const dRes = await Aes.decryptAsync(eRes, key, iv)
console.log('aes-neat', str, dRes, str === dRes)
}
const testSM4Neat = async () => {
const str = '一襟晚照淡风云,半船蝉音半梵心。江月吟尽古今事,白首偶趣三千经'
const key = await SM4.keyAsync(256)
const iv = await SM4.ivAsync(16)
const eRes = await SM4.encryptAsync(str, key, iv)
const dRes = await SM4.decryptAsync(eRes, key, iv)
console.log('sm4-neat', str, dRes, str === dRes)
}
const testAes = async () => {
const str = '我心素以闲,清川澹若此';
const key = await Aes.keyAsync();
const iv = await Aes.ivAsync();
const eRes = new Array<Uint8Array>();
const enc = new Aes(key, iv, 'encrypt', 'CBC');
eRes.push(await enc.updateAsync(str));
eRes.push(await enc.finalAsync());
const dRes = new Array<Uint8Array>();
const dec = new Aes(key, iv, 'decrypt', 'CBC');
for (let data in eRes){
dRes.push(await dec.updateAsync(data));
}
dRes.push(await dec.finalAsync());
const dData = Aes.exportData(dRes, 'utf8');
console.log(str, dData, str === dData);
}
const testSM4 = async () => {
const str = '我心素以闲,清川澹若此';
const key = await Aes.keyAsync();
const iv = await Aes.ivAsync();
const eRes = new Array<Uint8Array>();
const enc = new SM4(key, iv, 'encrypt', 'CBC');
eRes.push(await enc.updateAsync(str));
eRes.push(await enc.finalAsync());
const eData = Aes.exportData(eRes, 'binary');
const dRes = new Array<Uint8Array>();
const dec = new SM4(key, iv, 'decrypt', 'CBC');
dRes.push(await dec.updateAsync(eData));
dRes.push(await dec.finalAsync());
const dData = Aes.exportData(dRes, 'utf8');
console.log(str, dData, str === dData);
}
(async () => {
await testAes();
await testSM4();
await testAesNeat();
await testSM4Neat();
})();
```
### Asymmetric encryption
```typescript
import { RsaKeyGenerator, KeyPair, Rsa, SM2KeyGenerator, SM2 } from '@starryn/crypto'
const testRsa = async () => {
const decoder = new TextDecoder();
const str = "我心素以闲,清川澹若此";
const generator = new RsaKeyGenerator(4096, 2);
const keyPair = await generator.generateAsync();
const publicKey = await keyPair.exportPublicAsync('PEM');
const privateKey = await keyPair.exportPrivateAsync('PEM');
const pubKey = await KeyPair.importPublicAsync(publicKey, 'PEM');
const priKey = await KeyPair.importPrivateAsync(privateKey,'PEM');
const enc = new Rsa('encrypt', pubKey, "oaep");
const dec = new Rsa('decrypt', priKey, "oaep");
const ctext = await enc.updateAsync(str);
const rtext = await dec.updateAsync(ctext);
const ctxt = decoder.decode(rtext);
generator.dispose();
keyPair.dispose();
pubKey.dispose();
priKey.dispose();
enc.dispose();
dec.dispose();
console.log('rsa', str, ctxt, str === ctxt);
}
const testSM2 = async () => {
const decoder = new TextDecoder()
const str = '一襟晚照淡风云,半船蝉音半梵心。江月吟尽古今事,白首偶趣三千经'
const generator = new SM2KeyGenerator()
const keyPair = await generator.generateAsync()
const publicKey = await keyPair.exportPublicAsync('PEM', 'SM2')
const privateKey = await keyPair.exportPrivateAsync('PEM', 'SM2')
const pubKey = await KeyPair.importPublicAsync(publicKey, 'PEM', 'SM2')
const priKey = await KeyPair.importPrivateAsync(privateKey, 'PEM', 'SM2')
const enc = new SM2('encrypt', pubKey, 'oaep')
const dec = new SM2('decrypt', priKey, 'oaep')
const ctext = await enc.updateAsync(str)
const rtext = await dec.updateAsync(ctext)
const ctxt = decoder.decode(rtext)
generator.dispose()
keyPair.dispose()
pubKey.dispose()
priKey.dispose()
enc.dispose()
dec.dispose()
console.log('sm2', str, ctxt, str === ctxt)
}
(async () => {
await testRsa();
await testSM2();
})()
```
### Message Digest
```typescript
import { Md5, SM3 } from '@starryn/crypto';
(async () => {
const str = '我心素以闲,清川澹若此';
let hash = await Md5.digestAsync(str);
console.log(hash);
hash = await SM3.digestAsync(str);
console.log(hash);
})();
```