精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Linux Kernel非對稱密碼算法的實現

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-06-13 11:49 ? 次閱讀

作者簡介:

baron (csdn:代碼改變世界ctw),九年手機安全/SOC底層安全開發經驗。擅長trustzone/tee安全產品的設計和開發。

在默認情況下,本文講述的都是ARMV8-aarch64架構,linux kernel 5.14

目錄

1、RSA 開關

2、RSA 實現

3、其它非對稱密碼

4、非對稱密碼算法的使用示例

5、總結

1、RSA 開關

RSA的實現由 CONFIG_CRYPTO_RSA 宏控制,該宏依賴于:

CONFIG_CRYPTO_AKCIPHER

CONFIG_CRYPTO_MANAGER

CONFIG_MPILIB

CONFIG_ASN1

(linux/crypto/Kconfig)
config CRYPTO_RSA  tristate "RSA algorithm"  select CRYPTO_AKCIPHER  select CRYPTO_MANAGER  select MPILIB  select ASN1  helpGenericimplementationoftheRSApublickeyalgorithm.

2、RSA 實現

(linux/crypto/rsa.c)
static struct akcipher_alg rsa = {  .encrypt = rsa_enc,  .decrypt = rsa_dec,  .set_priv_key = rsa_set_priv_key,  .set_pub_key = rsa_set_pub_key,  .max_size = rsa_max_size,  .exit = rsa_exit_tfm,  .base = {    .cra_name = "rsa",    .cra_driver_name = "rsa-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct rsa_mpi_key),  },};

主要實現了4個功能:

rsasetpriv_key

rsasetpub_key

rsa_enc

rsa_dec

其中 rsa_set_priv_key和 rsa_set_pub_key的實現,主要就是接受raw格式的密鑰(DER格密鑰),將其轉換成nddpq等因子填充到密碼學結構體中。rsa_enc和 rsa_dec ,主要就是 公鑰加密、私鑰解密的這種用法。

此類密碼學具體算法的實現,都是由 linux/lib/mpi 第三方libary實現的,是一種C語言的實現方式。

3、其它非對稱密碼

(1)、實現了3個ecdsa的密碼算法

ecdsanistp192

ecdsanistp256

ecdsanistp384

以為ecdsanistp192 為例:

(linux/crypto/ecdsa.c)
static struct akcipher_alg ecdsa_nist_p192 = {  .verify = ecdsa_verify,  .set_pub_key = ecdsa_set_pub_key,  .max_size = ecdsa_max_size,  .init = ecdsa_nist_p192_init_tfm,  .exit = ecdsa_exit_tfm,  .base = {    .cra_name = "ecdsa-nist-p192",    .cra_driver_name = "ecdsa-nist-p192-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct ecc_ctx),  },};

僅僅實現了兩個接口函數:

ecdsa_verify : 公鑰驗簽

ecdsasetpub_key :導入公鑰

(2)、實現了1個sm2的密碼算法

(linux/crypto/sm2.c)
static struct akcipher_alg sm2 = {  .verify = sm2_verify,  .set_pub_key = sm2_set_pub_key,  .max_size = sm2_max_size,  .init = sm2_init_tfm,  .exit = sm2_exit_tfm,  .base = {    .cra_name = "sm2",    .cra_driver_name = "sm2-generic",    .cra_priority = 100,    .cra_module = THIS_MODULE,    .cra_ctxsize = sizeof(struct mpi_ec_ctx),  },};

僅僅實現了兩個接口函數:

sm2_verify : 公鑰驗簽

sm2setpub_key :導入公鑰

(3)、實現了1個ecr的密碼算法

(linux/crypto/ecrdsa.c)
static struct akcipher_alg ecrdsa_alg = {  .verify    = ecrdsa_verify,  .set_pub_key  = ecrdsa_set_pub_key,  .max_size  = ecrdsa_max_size,  .exit    = ecrdsa_exit_tfm,  .base = {    .cra_name   = "ecrdsa",    .cra_driver_name = "ecrdsa-generic",    .cra_priority   = 100,    .cra_module   = THIS_MODULE,    .cra_ctxsize   = sizeof(struct ecrdsa_ctx),  },};

僅僅實現了兩個接口函數:

ecrdsa_verify : 公鑰驗簽

ecrdsasetpub_key :導入公鑰

4、非對稱密碼算法的使用示例

如下所示,實現了 public_key_verify_signature(key,signature), 這個函數的實現,也被export出來,相當于又封裝了一層。另外其它模塊如果有對非對稱密碼學算法的需求,也可以直接調用非對稱密碼學算法的API,例如直接調用如下這樣的函數:

crypto_akcipher_verify()

crypto_akcipher_set_pub_key()

如下是 public_key_verify_signature(key,signature)的實現,也可以當作非對稱密碼學算法的使用示例:

(linux/crypto/asymmetric_keys/public_key.c)


/* * Verify a signature using a public key. */int public_key_verify_signature(const struct public_key *pkey,        const struct public_key_signature *sig){  struct crypto_wait cwait;  struct crypto_akcipher *tfm;  struct akcipher_request *req;  struct scatterlist src_sg[2];  char alg_name[CRYPTO_MAX_ALG_NAME];  char *key, *ptr;  int ret;
  pr_devel("==>%s()
", __func__);
  BUG_ON(!pkey);  BUG_ON(!sig);  BUG_ON(!sig->s);
  ret = software_key_determine_akcipher(sig->encoding,                sig->hash_algo,                pkey, alg_name);  if (ret < 0)    return ret;
  tfm = crypto_alloc_akcipher(alg_name, 0, 0);  if (IS_ERR(tfm))    return PTR_ERR(tfm);
  ret = -ENOMEM;  req = akcipher_request_alloc(tfm, GFP_KERNEL);  if (!req)    goto error_free_tfm;
  key = kmalloc(pkey->keylen + sizeof(u32) * 2 + pkey->paramlen,          GFP_KERNEL);  if (!key)    goto error_free_req;
  memcpy(key, pkey->key, pkey->keylen);  ptr = key + pkey->keylen;  ptr = pkey_pack_u32(ptr, pkey->algo);  ptr = pkey_pack_u32(ptr, pkey->paramlen);  memcpy(ptr, pkey->params, pkey->paramlen);
  if (pkey->key_is_private)    ret = crypto_akcipher_set_priv_key(tfm, key, pkey->keylen);  else    ret = crypto_akcipher_set_pub_key(tfm, key, pkey->keylen);  if (ret)    goto error_free_key;
  if (sig->pkey_algo && strcmp(sig->pkey_algo, "sm2") == 0 &&      sig->data_size) {    ret = cert_sig_digest_update(sig, tfm);    if (ret)      goto error_free_key;  }
  sg_init_table(src_sg, 2);  sg_set_buf(&src_sg[0], sig->s, sig->s_size);  sg_set_buf(&src_sg[1], sig->digest, sig->digest_size);  akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size,           sig->digest_size);  crypto_init_wait(&cwait);  akcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG |              CRYPTO_TFM_REQ_MAY_SLEEP,              crypto_req_done, &cwait);  ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait);
error_free_key:  kfree(key);error_free_req:  akcipher_request_free(req);error_free_tfm:  crypto_free_akcipher(tfm);  pr_devel("<==%s() = %d
", __func__, ret);  if (WARN_ON_ONCE(ret > 0))    ret = -EINVAL;  return ret;}EXPORT_SYMBOL_GPL(public_key_verify_signature);

5、總結

Linux Kernel非對稱密碼算法的實現總結如下:

實現了RSA的:“導入公鑰、導入私鑰、公鑰加密私鑰解密” 功能

實現了ecdsa的:”導入公鑰、公鑰驗簽” 功能

實現了sm2的:”導入公鑰、公鑰驗簽” 功能

實現了ecr的:”導入公鑰、公鑰驗簽” 功能

原文標題:Linux Kernel中非對稱密碼算法的實現

文章出處:【微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11230

    瀏覽量

    208933
  • 函數
    +關注

    關注

    3

    文章

    4307

    瀏覽量

    62433
  • RSA
    RSA
    +關注

    關注

    0

    文章

    59

    瀏覽量

    18864
  • 密碼算法
    +關注

    關注

    0

    文章

    18

    瀏覽量

    7379

原文標題:Linux Kernel中非對稱密碼算法的實現

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    快充充電器基于非對稱橢圓曲線加密算法的單芯片認證方案

    基于非對稱橢圓曲線加密算法的單芯片認證方案
    發表于 08-15 10:41 ?1943次閱讀
    快充充電器基于<b class='flag-5'>非對稱</b>橢圓曲線加密<b class='flag-5'>算法</b>的單芯片認證方案

    算法科普:非對稱算法

    非對稱算法,你了解多少呢?
    的頭像 發表于 09-05 21:07 ?5227次閱讀
    <b class='flag-5'>算法</b>科普:<b class='flag-5'>非對稱</b><b class='flag-5'>算法</b>

    “雙系統”出爐!瑞芯微RK3562J非對稱AMP:Linux+RTOS/裸機

    。“非對稱AMP”雙系統是指多個核心相對獨立運行不同的操作系統或裸機應用程序,如Linux + RTOS/裸機,但需一個主核心來控制整個系統以及其它從核心。每個處理器核心相互隔離,擁有屬于自己的內存
    發表于 11-21 16:44

    單片機處理非對稱加密算法

    普通單片機可以處理非對稱加密算法嗎?速度如何?求大神解答
    發表于 09-17 12:38

    對稱性加密算法

    對稱性加密算法對稱式加密就是加密和解密使用同一個密鑰。信息接收雙方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是對數據進行加解密了。對稱
    發表于 07-19 06:32

    對稱加密算法是什么

    對稱加密算法也叫私鑰加密算法,其特征是收信方和發信方使用相同的密鑰,即加密密鑰和解密密鑰是相同或等價的。非對稱加密算法也叫公鑰加密
    發表于 07-22 07:09

    密碼學系列 - 國密算法 精選資料分享

    時,需要通過加密芯片的接口進行調用。采用該算法已經研制了系列芯片、智能IC卡、智能密碼鑰匙、加密卡、加密機等安全產品,廣泛應用于電子政務、電子商務及國民經濟的各個應用領域(包括國家政務通、警務通等重要領域)。該算法不公開SM2:
    發表于 07-23 07:07

    淺談對稱加密算法非對稱密鑰加密算法

    什么是對稱密鑰密碼體制?對稱密鑰密碼體制的缺點是什么?非對稱加密算法又是什么?
    發表于 12-23 06:05

    “國產雙系統”出爐,RK3568J非對稱AMP:Linux+RTOS/裸機

    多處理架構。“非對稱AMP”雙系統是指多個核心相對獨立運行不同的操作系統或裸機應用程序,如Linux + RTOS/裸機,但需一個主核心來控制整個系統以及其它從核心。每個處理器核心相互隔離,擁有屬于自己的內存
    發表于 12-01 09:35

    什么是非對稱加密?非對稱加密概念

    對稱加密算法在加密和解密時使用的是同一個秘鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡
    發表于 12-10 10:38 ?2.2w次閱讀
    什么是<b class='flag-5'>非對稱</b>加密?<b class='flag-5'>非對稱</b>加密概念

    java實現非對稱加密算法的過程

    對稱式加密:解密方式是加密方式的逆運算,即加密和解密使用的是同一個密鑰(初等加密算法)。非對稱式加密:加密和解密需要兩個密鑰進行,這兩個密鑰是公鑰和私鑰(高等加密算法)。
    發表于 12-10 10:54 ?5398次閱讀
    java<b class='flag-5'>實現</b><b class='flag-5'>非對稱</b>加密<b class='flag-5'>算法</b>的過程

    如何理解區塊鏈密碼學中的非對稱加密

    當前密碼學中的加密解密方式主要能分成兩類,分別是對稱加密和非對稱加密。這兩個加密體系的構成都是一樣的,都包括:加解密算法、加密密鑰、解密密鑰。
    發表于 11-29 11:36 ?2293次閱讀

    利用EVPN實現子網間路由的非對稱對稱模型

    和外部網絡可以通過 EVPN 外部路由到達。 Cumulus Linux 3.6 版本支持帶有非對稱模型的 EVPN 外部路由,僅將 L3VNI 用于外部路由。
    的頭像 發表于 04-08 15:29 ?2752次閱讀
    利用EVPN<b class='flag-5'>實現</b>子網間路由的<b class='flag-5'>非對稱</b>或<b class='flag-5'>對稱</b>模型

    密碼學:如何使用非對稱密鑰算法來交換共享私鑰

    在我們的密碼學系列教程的最后兩期中,我們介紹了密碼學的基本概念和兩種基本類型。本節討論最常見的加密算法的具體實現細節,從基本的 XOR 函數開始,然后進入當今使用的更復雜的
    的頭像 發表于 12-19 15:28 ?1968次閱讀
    <b class='flag-5'>密碼</b>學:如何使用<b class='flag-5'>非對稱</b>密鑰<b class='flag-5'>算法</b>來交換共享私鑰

    “國產雙系統”出爐,RK3568J非對稱AMP:Linux+RTOS/裸機

    非對稱AMP”雙系統是什么AMP(AsymmetricMulti-Processing),即非對稱多處理架構。“非對稱AMP”雙系統是指多個核心相對獨立運行不同的操作系統或裸機應用程序,如
    的頭像 發表于 09-13 08:07 ?1398次閱讀
    “國產雙系統”出爐,RK3568J<b class='flag-5'>非對稱</b>AMP:<b class='flag-5'>Linux</b>+RTOS/裸機