crypto学习

crypto:是指加密,有很多种不同的加密方式

aes:对称分组加密, 密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。

des:分组加密。以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法。DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法

ecc:椭圆曲线加密,它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。

pka:非对称加解密,

rng:没有搜到是什么加密方式

sha1:sha1哈希算法,跟md5差不多

程序里调用了libcrypto.a库,基本没有具体实现

int main(void)
{
    rcc_enable_peripheral_clk(RCC_PERIPHERAL_SAC, true);

    aes_ecb();//改为不同的加密方式

    /* Infinite loop */
    while (1) { }

    return 0;
}


void aes_ecb(void)
{
    aes_init(AES_Key, 16, 0, NULL);
    aes_crypto(AES_PLAIN, AES_BYTELEN, 0, AES_OUT);
    aes_close();
}

void des_ecb(void)
{
    U8 key[8] = {
        0x01,
        0x23,
        0x45,
        0x67,
        0x89,
        0xab,
        0xcd,
        0xef,
    };
    U8 in[8] = {
        0x5a,
        0x5a,
        0x5a,
        0x5a,
        0x5a,
        0x5a,
        0x5a,
        0x5a,
    };
    U8 cipher[8] = {
        0x72,
        0xaa,
        0xe3,
        0xb3,
        0xd6,
        0x91,
        0x6e,
        0x92,
    };
    U8 out[8];

    des_init(key, 0, NULL);
    des_crypto(in, 8, 0, out);
    des_close();
    if (!memcmp(out, cipher, 8)) {
        //OK
    } else {
        //ERROR
    }
}

bool ecc_test(void)
{
    ECC_PARA ecc256_para;
    U8 sign_r[32];
    U8 sign_s[32];
    ECC_POINT sign_rs;
    U8 prikey[32];
    U8 pubkey_x[32];
    U8 pubkey_y[32];
    ECC_POINT pubkey;
    U8 message[16] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
    U8 sha256_digest[32];
    U8 error_status;

    // clear message digest buffer
    memset(sha256_digest, 0x00, 32);
    // gernerate digest by SHA-256
    error_status = sha256_hash(message, 16, sha256_digest);
    if (error_status != HashSuccess) {
        return false;
    }
    // Initialize the ECC_PARA stucture
    ecc256_para.ECC_p      = g_ecc256_p;
    ecc256_para.ECC_a      = g_ecc256_a;
    ecc256_para.ECC_b      = g_ecc256_b;
    ecc256_para.ECC_n      = g_ecc256_n;
    ecc256_para.ECC_G0x    = g_ecc256_Gx;
    ecc256_para.ECC_G0y    = g_ecc256_Gy;
    ecc256_para.ECC_NUMBIT = 256;
    // Initialize the ECC engine
    error_status = ecc_init(&ecc256_para); // initial ecc para
    if (error_status != ECCSUCCESS) {
        return false;
    }

    // Initialize the ECC_POINT stucture of public key
    pubkey.x = pubkey_x;
    pubkey.y = pubkey_y;
    // gernerate the ECC key para
    error_status = ecc_genkey(prikey, &pubkey);
    if (error_status != ECCSUCCESS) {
        return false;
    }

    // Initialize the ECC_POINT stucture of signature
    sign_rs.x = sign_r;
    sign_rs.y = sign_s;
    // sign the digest by private key
    error_status = ecdsa_sign(prikey, sha256_digest, &sign_rs);
    if (error_status != ECCSUCCESS) {
        return false;
    }
    // verify the signature by public key
    error_status = ecdsa_verify(&pubkey, sha256_digest, &sign_rs);
    if (error_status == ECCSUCCESS) {
        return true;
    } else {
        return false;
    }
}
…………估计不会用到,用的时候还是要调用库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值