kaven-basic - v4.5.0
    Preparing search index...

    kaven-basic - v4.5.0

    Kaven-Basic

    Kaven-Basic

    # NPM
    npm install kaven-basic

    # Yarn
    yarn add kaven-basic

    # PNPM
    pnpm i kaven-basic

    Node.js:

    import { GenerateGuid } from "kaven-basic";

    console.log(GenerateGuid());

    Browser:

    <!DOCTYPE html>
    <html lang="en">

    <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="kaven-basic/bundles/index.umd.js"></script>
    </head>

    <body>
    <script>alert(KavenBasic.GenerateGuid());</script>
    <script>
    (async () => {
    try {
    /**
    * @type { import("../src") }
    */
    const KavenBasic = window.KavenBasic;

    const {
    KavenLog,
    FormatCurrentDate,
    GenerateGuid,
    KavenBrowserRSA,
    SequenceEqual,
    AnsiColors_BrightMagenta,
    AnsiColors_Green,
    } = KavenBasic;

    {
    KavenLog.CreateInfo(FormatCurrentDate()).WriteToConsole({
    Level: AnsiColors_BrightMagenta,
    Message: AnsiColors_Green,
    });
    KavenLog.CreateWarn(GenerateGuid()).WriteToConsole();
    }

    const str = "test 中文";

    // Create, Encrypt/Decrypt, Sign/Verify
    {
    const rsa = await KavenBrowserRSA.Create();

    console.log(rsa.PublicKey);
    console.log(rsa.PrivateKey);

    // RSA-OAEP
    const enc = new TextEncoder();
    const data = enc.encode(str);

    const encryptedData = await rsa.Encrypt(data);
    const decryptedData = await rsa.Decrypt(encryptedData);

    console.log(SequenceEqual(new Uint8Array(decryptedData), data));

    const dec = new TextDecoder();
    const decryptedStr = dec.decode(decryptedData);

    console.log(str === decryptedStr);

    // RSA-PSS
    const signature = await rsa.Sign(data);
    const pass = await rsa.Verify(data, signature);

    console.log(pass);
    }

    // Import
    {
    const publicKey = `-----BEGIN PUBLIC KEY-----
    MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArb0e2QEoDsnL41+3esUo1WUp6/lxYwhJd9CvAyahXlZNjLnLOpSK2VjTaGMU+FiL4pwCYpQDAjDl8dPyGokVBwG34e6i4nOmGl0cHnuE+fwPZrP7cQwVMVYHHRpVaVwDLHls3Jmz8xOlvihPEyBxzBYXD5Ssus227Akl0FRhaJ3P+va7vENMGILEIjKTF9HAafHxYWay4qj6fiwyS+mx8DoNVsYaDtcRrgqm2HOiyPST3qBnk9IH171Ozo7bUzJsvQrtBUVnuuYR8MlcbamMQxdlG6sC9fZRX4JCiF2zYcRFVWR9Qr6mrPv+FTRDr6YEB/I4D9+JOf8vrKvLsu3eppV5OXRmTgi3ttxIbzfhJBlnANg87nvdmuXQgPhfJ7UU7gbMwjk/+3PobAA4uHRJz3Et7WNok5rRBv0qTw9GVK99SfGbYJB8xbG61Rj3fOFphlc5CbZn2/7bwUnCr23jU0gzeS0WkhZWNekmAFa+kktW0raG9LuhGCzcE8J0LpXrr3gjQnESLCcWlDhKx3eZhNOKOBWpHQt9uo3DIadmEpSJrkga7SRLw4bTv6B41Y+gm+VBTAZipo77pWbYWEpZ+AkSBTRq06YvepuUteniNYVX+vtjh5LSn0OJRsK2HXxP62zZxwhuc05DaEIFvqo3ihVh7pOab8LkRtMtlhMwIFMCAwEAAQ==
    -----END PUBLIC KEY-----`;

    const privateKey = `-----BEGIN PRIVATE KEY-----
    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
    -----END PRIVATE KEY-----`;

    const str = "kaven@wuwenkai.com 中文";

    const rsa = new KavenBrowserRSA(publicKey, privateKey);

    console.assert(await rsa.DecryptFromString(await rsa.EncryptToString(str)) === str);
    console.assert(await rsa.VerifyFromString(str, await rsa.SignToString(str)));

    // from KavenRSA
    const encryptedData = "HzAXSygyMgIMNr5TlCyL/uYdSjFjL1V0Ccioq85KO5Sx9a6IvTKSZQkVDtNYron4mwcj/n7ZaATpSJDn3cJWHihtTYNiQeMS960WHEaCYtyipx4k43BJoxlRkUy0SDpdPnsQ032V7emDIB+L2x/Ju01xDbF0z5igSTIXJFbtS2epD4kkrmMdHLc/d2WdnBgK5qFJOArehStC007CQN8XsnXTxgFMMYO7emIqGLMCvzrfHBCjN380Ns3yYcOqyws07SeOAxbM7EYG5B9zyJQXdSG00h8GWKDlB+/PqGY0pPuKwwMfRLns5sn1twCM6MVqShvsS6E3yiFWsbZS4NJy4hBPRiQirslpp3XOB0OEEByvQ58dtuFo/bGwyfI9FsNymqof6Kp5Y9SUYZwbCgxCvI0mqAyHdD10uWxi7lm1klazywb5roCzWqMgMhqa8+6XmcyDKZSKWuVu70vV8WZvKLTnOi6TmdSe9xz/5Vo6OoAAj1YPMh+7GMu1HLruthl2/TGfdzwH7F4tkrcaWLZVZ3ZpKP/SXg38NnMlg3L/B3i4gU57XVGSkYPTLvN3zFx4K7/Zld7Y6TZzt7p2qlUt475jBE8eZ5U1Fllwf7V5al2yAZkm3HHq8WUeVdabOq0FySd1GLyy0+Fgqp+kpBoCtRZN47ICxFD+KR/HsYBIJVw=";
    const decryptedStr = await rsa.DecryptFromString(encryptedData);
    console.assert(decryptedStr === str);

    const signature = "QF0gO0tbCUMa5RLm3pY7UoQiR07vMFPBLf/Gt9hcD2HP5wcBDE3/ttgy3WQxoxscW46zy1alR/tNMT+OPvn8W+IU1IJT+oRORsiQAMvWev8UHaF7b5oU0+Oe6Ez0pcR9dSWwziaiGLtQ1yFFwzyivXO/iH+RIAXu5l9cOMIl+ah94d5ZgNd49I+ZnmLbAuzwD0dOiV/bNSB+3+iMgnqOqu9FURqInZZtoWM+rV5mZ7T/QOYGgyUZkpc5hszD7wztBXjNqp/yyIuCnGkSoc34Vu3lcSEOqik3S6caWFv0iJoy9smyo7x3uOcTaQ4+OfGFdJzSQA1DwVZUlfxlmzMpp/cRjO4b5lBmcwzLxoEKJtvhagc+n51bT63/IW1pFhpwf9deZ+moSIbZfAZn2Ytb7eij+zuXe/Jqs2cGLu/rcnhMJEf7/+sCzuxUtd/xBWx7gGTKGjPrgnlw23eSwfnUsL+HvicHBTgyXrOI8lofmMqsT5shnjQGgMpCECs3q9rhq258mLB0syTqtA8Gg9CDz+s1aketjNqLcdaxDCqNM0LYOEvY7kL9AYrmjqyTg5Ke2TdJx5pdXyqbjBSGEWY7FXb+LZhCLQpCdu3SFQ0isV3L7z+zvwEOlIfL8aHqjfKZHxW+NSUiRBXYOCfy8Xe5ZBKLMuks0iQSwGi3mCjGbrU=";
    console.assert(await rsa.VerifyFromString(str, signature));
    }
    } catch (ex) {
    console.error(ex);
    }
    })();
    </script>
    </body>

    </html>

    The hash method provided in this library is designed with simplicity and correctness in mind, not speed. If your use case involves frequent calls to the hash function or processing large volumes of data, you may experience performance limitations.

    For performance-critical applications, consider using a more optimized hashing library or implementation (e.g., one based on hardware-accelerated algorithms or highly optimized native code).