libsodium密码库

        Libsodium 是一个开源、跨平台、跨语言的加密库,提供了一组简单易用的函数,大大简化了加密、散列、签名、鉴别、解密等复杂工作。 libsodium 的设计强调高安全,强调任何“神奇”的常量数字都要有来源根据(无来历不明的常量)。除了强调高安全性,基础算法的性能也全面超越 NIST 标准下的绝大多数其他实现。支持许多种主流的加密算法和散列算法,包括 AES256-GCM 和 ChaCha20-Poly1305 两种 AEAD 加密方案。此外还提供了一系列方便实用的函数,可完成随机数的生成、大数的计算、编码和解码等辅助性工作。libsodium 的目标是提供构建高层密码学工具所需的核心算法。

       

        在程序中,只需包含头文件 sodium.h 即可。在编译时加上-lsodium库

#include <sodium.h>

int main(void)
{
    if (sodium_init() == -1) {
        return 1;
    }
    ...
}

        在使用 Libsodium 的其他函数之前,必须先调用函数 sodium_init()。该函数不需要任何参数,返回 0 表示成功,返回 -1 表示失败,返回 1 则表示已经初始化过了。sodium_init()返回后,libsodium 的其他所有函数都是 线程安全 的。

  sodium_init() 初始化 libsodium 库,必须在 libsodium 库的其他函数之前被调用。这个函数可以被多次重复调用,但是不能多个线程并发调用,如果你的程序中有这种场景,你应该自己加锁。

  sodium_init() 不会做任何 内存分配。 但是,在 Unix 系统中, 会打开 /dev/urandom 文件,并且会保持这个文件 fd 打开,因此在chroot()之后,/dev/urandom仍然能使用。多次调用 sodium_init() 会导致多个 fd 被打开。

Sodium 是一个用于加密,解密,数字签名,密码哈希,等的,现代的,易用的密码学库。

sodium_init() 初始化 libsodium 库,必须在 libsodium 库的其他函数之前被调用。

sodium_init() 返回 0 表示 成功, -1 表示 失败, 1 表示库已经被初始化过了。

 crypto_box_easy()函数是Libsodium库中用于非对称密钥加密消息的函数。

,用于对消息进行加密。这是一个用于不对称加密的函数,需要一个共享的秘密密钥来加密和解密消息。

其函数原型如下:

int crypto_box_easy( unsigned char *ciphertext,

    const unsigned char *message,

    unsigned long long message_len,

    const unsigned char *nonce,

    const unsigned char *publickey,

    const unsigned char *secretkey );

函数参数

  • ciphertext:加密后的消息,必须至少crypto_box_MACBYTES + message_len字节长。
  • message:待加密的原始消息。
  • message_len:原始消息的长度。
  • nonce:一个随机数,长度为crypto_box_NONCEBYTES。每对公钥和私钥每次加密都必须使用一个唯一的随机数。
  • publickey:对方的公钥,长度为crypto_box_PUBLICKEYBYTES
  • secretkey:自己的私钥,长度为crypto_box_SECRETKEYBYTES

函数返回值:

  • 如果成功,返回0。
  • 如果失败(例如,因为内存不足),则返回-1,并设置sodium标志以指示失败。

crypto_box_open_easy是一个从libsodium库中的函数,可以用于打开和解密一个被crypto_box_easy加密过的消息。

函数原型如下:

int crypto_box_open_easy(unsigned char *message, const unsigned char *ciphertext, unsigned long long ciphertext_len, const unsigned char *nonce, const unsigned char *publickey, const unsigned char *secretkey);

这个函数检查并解密一个密文信息ciphertext。解密的结果将被存储在message中。如果密文验证失败(例如,如果它已被篡改),该函数将返回-1并且message不会被改变。否则,该函数返回0,message包含解密后的消息。

函数参数是:

  • message: 解密后的消息。
  • ciphertext: 密文。
  • ciphertext_len: 密文的长度。
  • nonce: 用于此特定消息的nonce。
  • publickey: 使用这个公钥加密的消息。
  • secretkey: 用于解密的配对的私钥。

 两种密码体制

一种称为对称密钥密码体制;另一种称为公钥密码体制。

在对称密钥密码体制中,加密和解密使用相同的密钥。密钥由通信双方事先约定。算法可以公开,而密钥需要保密。

公钥密码体制在加密和解密过程中使用不同的密钥。并且使用其中一个进行加密,则需要用另一个才能解密。这两个成对的密钥在使用时,一个密钥作为私钥,需要保密;另一个密钥作为公钥,可以公开。

 MAC 报文鉴别码----------AE-----AEAD

通常是经过加密的散列值。计算报文鉴别码的算法称为 MAC 算法。常用的 MAC 算法有:GMAC \ CBC-MAC \ Poly1305

AE这种加密方案不仅能提供机密性,还能提供完整性   是对称加密算法和 MAC 算法的结合体。在加密一个报文时,需要一个密钥和一个不重数,加密后将得到密文和一个报文鉴别码。报文鉴别码须随同密文一起发送给接收方。

AEAD相比于 AE,AEAD 在加、解密时还可以选择性地给定一些没有保密性要求的「附加数据」,例如版本号、时间戳、报文的长度和编码方式等。这些附加数据会参与到报文鉴别码的计算中去,但不会被加密,也不会成为密文的一部分。附加数据可以随同密文一起发送。


int main(void)
{
    if (sodium_init() == -1) {
        return 1;
    }
    //首先需要生成一对密钥,可以使用 crypto_box_keypair() 函数:
    unsigned char pk[crypto_box_PUBLICKEYBYTES];
    unsigned char sk[crypto_box_SECRETKEYBYTES];
    crypto_box_keypair(pk, sk);

    //使用 crypto_box_easy() 函数对信息进行加密
    const unsigned char mesg[] = "source";
    const unsigned char * message= mesg;

    int  MESSAGE_LEN = mystrlen(message);


    unsigned char nonce[crypto_box_NONCEBYTES];//用于公钥和私钥进行加密或解密操作;使用随机或伪随机数作为nonce;提高加密的安全性
    unsigned char ciphertext[mystrlen(message) + crypto_box_MACBYTES];//加密后密文
    randombytes_buf(nonce, sizeof nonce);//以用于创建一个安全的、随机的秘钥。

    // 实现非对称加密
    if (crypto_box_easy(ciphertext, message, mystrlen(message), nonce, pk, sk) != 0) {
        return -1;
    }
    unsigned char decrypted[MESSAGE_LEN];//解密后的数据

    if (crypto_box_open_easy(decrypted, ciphertext, mystrlen(message) + crypto_box_MACBYTES, nonce, pk, sk) != 0) {
        //验证失败,消息被篡改或者是用了一个错误的密钥 
        cout << "验证失败,消息被篡改或者是用了一个错误的密钥" << endl;
    }
    cout << "after decrypting message : "<< decrypted << endl;
    cout << "public key : "<< decrypted << endl;
    cout << "provate key : "<< decrypted << endl;


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值