商用密码标准实现

news/2024/12/21 2:40:59/

文章目录

  • 商用密码标准实现
    • 简述 GM/T0009 4种数据转换的功能,根据你的理解,每种转换功能给出至少一个例子
    • 参考课程代码sdfproject,基于一个模块utils.c,utils.h使用四个函数分别实现4种数据转换的功能
    • src中在testsdf.c中编写main函数 测试四个转换功能。
    • 提交git log结果

商用密码标准实现

简述 GM/T0009 4种数据转换的功能,根据你的理解,每种转换功能给出至少一个例子

  • 位串转8位字节串

    • 功能:将由字符 '0''1' 组成的二进制位串转换为字节串(即字节数组)。每个字节由8个二进制位组成。
    • 例子:输入位串为 10000010,长度为8。转换后的字节串为 0x82(十六进制表示),对应的十进制值为 130
  • 字节串转位串

    • 功能:将字节串(即字节数组)转换回二进制位串表示。每个字节被分解为其构成的8个二进制位。
    • 例子:输入字节串为 {0x12, 0x34, 0x56}。转换后的位串为 000100100011010001010110
  • 字节串转整数

    • 功能:将一个字节串解释为一个大端序(Big-Endian)的无符号整数。字节串中的第一个字节是最显著的字节。
    • 例子:输入字节串为 {0x12, 0x34}。转换后的整数值为 0x1234(十六进制表示),对应的十进制值为 4660
  • 整数转字节串

    • 功能:将一个整数转换为指定长度的大端序(Big-Endian)字节串。如果整数不足以填满指定长度,则高位用零填充。
    • 例子:输入整数为 1234,期望的字节串长度为2。转换后的字节串为 {0x04, 0xd2}

参考课程代码sdfproject,基于一个模块utils.c,utils.h使用四个函数分别实现4种数据转换的功能

  • utils.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "utils.h"void bitstring_to_bytes(char *bitstring, int blen, char *bytes) {int mlen = (blen + 7) / 8;for (int i = 0; i < mlen; i++) {bytes[i] = 0;for (int j = 0; j < 8; j++) {int index = blen - 8 * (mlen - 1 - i) - j - 1;if (index >= 0 && bitstring[index] == '1') {bytes[i] |= 1 << j;}}}
}void bytes_to_bitstring(char *bytes, int mlen, char *bitstring) {int index = 0;for (int i = 0; i < mlen; ++i) {char binary[9];for (int j = 7; j >= 0; --j) {binary[7 - j] = ((bytes[i] & (1 << j))? '1' : '0');}binary[8] = '\0';for (int j = 0; j < 8; ++j) {bitstring[index++] = binary[j];}}bitstring[index] = '\0';
}unsigned int bytes_to_int(unsigned char *M, int mlen) {unsigned int x = 0;for (int i = 0; i < mlen; i++) {x += (1 << (8 * (mlen - 1 - i))) * M[i];}return x;
}void int_to_bytes(int x, int mlen, unsigned char *M) {for (int i = 0; i < mlen; i++) {M[i] = (x >> (8 * (mlen - 1 - i))) & 0xFF;}
}
  • utils.h
#ifndef _UTILS_H_
#define _UTILS_H_// 位串转8位字节串函数声明
void bitstring_to_bytes(char *bitstring, int blen, char *bytes);// 8位字节串转位串函数声明
void bytes_to_bitstring(char *bytes, int mlen, char *bitstring);// 8位字节串转整数函数声明
unsigned int bytes_to_int(unsigned char *M, int mlen);// 整数转8位字节串函数声明
void int_to_bytes(int x, int mlen, unsigned char *M);#endif

src中在testsdf.c中编写main函数 测试四个转换功能。

  • testsdf.c
#include <stdio.h>
#include <stdlib.h>
#include "utils.h"int main() {// 测试位串转8位字节串{char bitstring[] = "10000010";int blen = strlen(bitstring);char bytes[100];bitstring_to_bytes(bitstring, blen, bytes);int mlen = (blen + 7) / 8;printf("位串转8位字节串测试:\n");printf("原始位串: %s\n", bitstring);printf("转换后的字节串: ");for (int i = 0; i < mlen; i++) {printf("%02X ", (unsigned char)bytes[i]);}printf("\n\n");}// 测试8位字节串转位串{char bytes[] = {0x12, 0x34, 0x56};int mlen = sizeof(bytes) / sizeof(bytes[0]);char bitstring[100];bytes_to_bitstring(bytes, mlen, bitstring);printf("8位字节串转位串测试:\n");printf("原始字节串: ");for (int i = 0; i < mlen; i++) {printf("%02X ", (unsigned char)bytes[i]);}printf("\n转换后的位串: %s\n\n", bitstring);}// 测试8位字节串转整数{unsigned char M[] = {0x12, 0x34};int mlen = sizeof(M) / sizeof(M[0]);unsigned int x = bytes_to_int(M, mlen);printf("8位字节串转整数测试:\n");printf("原始字节串: ");for (int i = 0; i < mlen; i++) {printf("%02X ", (unsigned char)M[i]);}printf("\n转换后的整数: %u\n\n", x);}// 测试整数转8位字节串{int x = 1234;int mlen = 4;unsigned char M[100];int_to_bytes(x, mlen, M);printf("整数转8位字节串测试:\n");printf("原始整数: %d\n", x);printf("转换后的字节串: ");for (int i = 0; i < mlen; i++) {printf("%02X ", M[i]);}printf("\n\n");}return 0;
}
ld@DESKTOP-69L72QA:~/projects/sdfproject$ ./testsdf
Bit string to byte array test:
Original bit string: 10000010
Converted byte array: 82Byte array to bit string test:
Original byte array: 12 34 56
Converted bit string: 000100100011010001010110Byte array to integer test:
Original byte array: 12 34
Converted integer: 4660Integer to byte array test:
Original integer: 1234
Converted byte array: 00 00 04 D2

提交git log结果

ld@DESKTOP-69L72QA:~/projects/sdfproject$ git add .
ld@DESKTOP-69L72QA:~/projects/sdfproject$ git commit -m "sm"
[master eb4dc93] sm20 files changed, 317 insertions(+)create mode 100755 projects/sdfproject/Makefilecreate mode 100755 projects/sdfproject/bin/testcreate mode 100755 projects/sdfproject/bitstr2bytescreate mode 100755 projects/sdfproject/bytes2bitstrcreate mode 100755 projects/sdfproject/bytes2intcreate mode 100755 projects/sdfproject/compile.shcreate mode 100755 projects/sdfproject/docs/ref/GMT0018-2012.pdfcreate mode 100755 projects/sdfproject/include/.utils.h.swpcreate mode 100755 projects/sdfproject/include/sdf.hcreate mode 100755 projects/sdfproject/include/utils.hcreate mode 100755 projects/sdfproject/int2bytecreate mode 100755 projects/sdfproject/readme.mdcreate mode 100755 projects/sdfproject/src/sdf.ccreate mode 100755 projects/sdfproject/src/utils.ccreate mode 100755 projects/sdfproject/test/main.ccreate mode 100755 projects/sdfproject/testsdfcreate mode 100644 projects/sdfproject/testsdf.ccreate mode 100755 projects/sdfproject/utilscreate mode 100644 projects/sdfproject/utils.ccreate mode 100644 projects/sdfproject/utils.h
ld@DESKTOP-69L72QA:~/projects/sdfproject$ git log
commit eb4dc93452a684bb430ea427109a8c46bb5aacfd (HEAD -> master)
Author: <E6><9F><B3><E7><AC>11537298+liudi20221408@user.noreply.gitee.com>
Date:   Tue Dec 17 12:36:47 2024 +0800sm

http://www.ppmy.cn/news/1556800.html

相关文章

大数据:开启智能时代的钥匙

目录 一、什么是大数据&#xff1f; 二、大数据的应用领域 三、大数据面临的挑战 四、大数据的未来展望 在当今数字化浪潮汹涌澎湃的时代&#xff0c;大数据已然成为了一颗璀璨夺目的明星&#xff0c;其热度持续攀升&#xff0c;几乎渗透到了社会的每一个角落&#xff0c;宛…

STM32F407ZGT6-UCOSIII笔记11:任务内建消息队列

任务内建消息队列简化了外部定义的代码&#xff0c;而且也比外部消息队列更有效 本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册 文章提供测试代码讲解、完整工程下载、测试效果图 这次设计的实验在启动方面 还是有瑕疵的&#xff0c;但不影响观察效果&#xff1a…

Docker安装及基本使用

介绍 Docker于2013年首次发布&#xff0c;由Docker, Inc开发。‌‌Docker是一种用于构建、发布及运行应用程序的开源项目&#xff0c;它基于操作系统层级的虚拟化技术&#xff0c;将软件与其依赖项打包为容器‌。Docker的核心概念是“容器”&#xff08;Container&#xff09;…

长沙家具叠影床,让生活浸染自由浪漫

在繁华都市的喧嚣中&#xff0c;长沙铂乐家具叠影床宛如一方宁静的港湾&#xff0c;悄然静卧于家居空间。它以独特的设计语言&#xff0c;诉说着自由与浪漫的故事。 汲取世间万物之美&#xff0c;实现人与家具的美好互动&#xff0c;铂乐家具叠影床以光影交错为灵感&#xff0…

el-tree组件的父节点半选中状态—(选中和不选中的区别)

一.不选中父节点 回显数据需要在el-tree组件添加default-checked-keys属性 <template><div><el-button type"primary" click"handleShowData">回显数据</el-button><el-tree :props"{ children: children, label: name …

图的基本概念|存储

图的基本概念 图的定义 图G由顶点集V和边集E组成&#xff0c;记为G&#xff08;V&#xff0c;E) 其中V(G)表示图G中顶点的有限非空集&#xff1b;E&#xff08;G)表示图G中顶点之间的关系&#xff08;边&#xff09;集合。 若V{ v 1 , v 2 , … , v n v_{1},v_{2},\dots,v_{n…

Linux下调试工具:gdb

Windows和Linux下的调试有区别吗&#xff1f; 调试思路上一定是一样的&#xff1b;调试的操作方式有差别(Linux命令行调试&#xff0c;Windows窗口) 1.准备工作&#xff1a; 默认情况下&#xff0c;gdb无法进行对现在发布的程序进行调试(debug / release)。在Linux下用gcc编译…

repmgr集群部署-PostgreSQL高可用保证

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…