基于纠错码的哈希函数构造方案

news2024/9/23 1:22:59

一、前言

随着大数据时代的到来,交通数据量急剧增加,由此带来的交通安全问题日益凸显。传统的驾驶人信用管理系统在数据存储和管理上存在着诸多不足之处,例如中心化存储方案无法有效地进行信用存证及数据溯源。区块链技术以其去中心化和不可篡改的特性,在数据存储和管理方面展现出了巨大的潜力。区块链的固有特性也带来了另一个挑战——一旦数据被写入区块链,几乎不可能对其进行修改,这在某些情况下是不利的。为了解决这一问题,当前文章重点研究了如何构建具有高随机性的哈希算法——高度随机哈希函数(HRHF)。HRHF算法通过结合纠错码与SM3算法的Merkle-Damgård迭代结构,不仅增强了哈希值的随机性,还保证了算法的安全性和执行效率。实验结果显示,与经典的SHA-256算法相比,HRHF算法在多个关键指标上均有显著提升。

HRHF算法结合了纠错码与SM3算法的Merkle-Damgård迭代结构,通过这种方式增强了哈希值的随机性。选用了纠错能力更强的线性分组码与SM3算法相结合,并构造生成哈希值具有更强随机性的哈希函数。实验结果显示该算法不仅具有理想的雪崩效应特性,而且攻击者更难以逆推出原始消息,从而具备了更高的算法安全性。

二、算法设计原理

2.1 算法的创新点

(1)通过调整循环左移位数来进一步提升哈希值的随机性;

(2)通过优化迭代结构来提高算法的执行效率。

算法的具体使用流程:

  1. 初始化状态向量,为生成256位哈希值准备。
  2. 计算纠错码的生成矩阵。
  3. 对生成矩阵进行循环左移操作以增加随机性。
  4. 对输入数据进行迭代压缩操作。
  5. 输出最终的256位哈希值。

2.2 实现代码(C++)

#include <iostream>
#include <vector>
#include <cstdint>
#include <cassert>

// 哈希值长度
constexpr size_t HASH_LENGTH = 32; // 256 bits

// 线性分组码参数
constexpr size_t CODE_LENGTH = 32; // 码长
constexpr size_t CODE_DIMENSION = 6; // 维度

// 生成矩阵初始化
std::vector<std::vector<uint32_t>> generateMatrix() {
    // 实际应用中需要通过算法计算得到
    std::vector<std::vector<uint32_t>> matrix(CODE_DIMENSION, std::vector<uint32_t>(CODE_LENGTH));
    // 示例矩阵
    for (size_t i = 0; i < CODE_DIMENSION; ++i) {
        matrix[i][i] = 1;
    }
    return matrix;
}

// 生成码字
std::vector<uint32_t> generateCodeWord(const std::vector<std::vector<uint32_t>>& matrix) {
    std::vector<uint32_t> codeWord(CODE_LENGTH);
    // 假设这里使用生成矩阵生成码字
    for (size_t i = 0; i < CODE_LENGTH; ++i) {
        codeWord[i] = 0; // 初始化码字
        for (size_t j = 0; j < CODE_DIMENSION; ++j) {
            // 模2加法
            codeWord[i] ^= matrix[j][i];
        }
    }
    return codeWord;
}

// 循环左移
uint32_t rotateLeft(uint32_t value, int shift) {
    return (value << shift) | (value >> (32 - shift));
}

// 消息预处理
std::vector<uint32_t> preprocessMessage(const std::vector<uint8_t>& message) {
    // 添加消息长度,这里简化处理
    std::vector<uint8_t> extendedMessage = message;
    extendedMessage.push_back(0x80); // 添加结束标志
    extendedMessage.insert(extendedMessage.end(), 8, 0x00); // 添加长度占位符
    // 将消息转换为32位整数数组
    std::vector<uint32_t> words;
    for (size_t i = 0; i < extendedMessage.size(); i += 4) {
        uint32_t word = 0;
        for (size_t j = 0; j < 4 && i + j < extendedMessage.size(); ++j) {
            word |= static_cast<uint32_t>(extendedMessage[i + j]) << (24 - 8 * j);
        }
        words.push_back(word);
    }
    return words;
}

// 消息扩展
void extendMessage(std::vector<uint32_t>& words) {
    const size_t WORD_COUNT = 64; // 扩展后的字数量
    while (words.size() < WORD_COUNT) {
        uint32_t w = words.back();
        uint32_t w16 = words[words.size() - 16];
        words.push_back(w16 ^ rotateLeft(w16, 9) ^ rotateLeft(w16, 17) ^
            rotateLeft(w, 15) ^ rotateLeft(w, 23));
    }
}

// 布尔函数
uint32_t ff(uint32_t x, uint32_t y, uint32_t z, size_t j) {
    if (j >= 16 && j <= 63) {
        return x ^ y ^ z;
    }
    else {
        return (x & y) | ((~x) & z);
    }
}

// 布尔函数
uint32_t gg(uint32_t x, uint32_t y, uint32_t z, size_t j) {
    if (j >= 16 && j <= 63) {
        return x ^ y ^ z;
    }
    else {
        return (x & y) | (x & z) | (y & z);
    }
}

// 压缩函数
void compress(std::vector<uint32_t>& state, const std::vector<uint32_t>& words) {
    const size_t ROUND_COUNT = 64; // 迭代次数
    const size_t STATE_SIZE = 8; // 状态寄存器大小
    const uint32_t T[ROUND_COUNT] = { /* 常量表 */ };
    std::vector<uint32_t> ss1(STATE_SIZE), ss2(STATE_SIZE), tt1(STATE_SIZE), tt2(STATE_SIZE);

    for (size_t i = 0; i < ROUND_COUNT; ++i) {
        // 中间变量更新
        ss1[i] = rotateLeft(state[0], 7) + rotateLeft(state[4], 12);
        ss2[i] = ss1[i] ^ rotateLeft(state[0], 12);
        tt1[i] = ff(state[0], state[1], state[2], i) + state[3] + ss2[i] + words[i];
        tt2[i] = gg(state[4], state[5], state[6], i) + state[7] + ss1[i] + words[i + 64];

        // 状态寄存器更新
        state[0] = state[1];
        state[1] = state[2];
        state[2] = state[3];
        state[3] = tt1[i];
        state[4] = state[5];
        state[5] = state[6];
        state[6] = state[7];
        state[7] = tt2[i];
    }
}

// 主算法
std::vector<uint8_t> hrhf(const std::vector<uint8_t>& message) {
    std::vector<uint32_t> state(HASH_LENGTH / 4, 0); // 初始化寄存器
    std::vector<std::vector<uint32_t>> matrix = generateMatrix();
    std::vector<uint32_t> codeWord = generateCodeWord(matrix);

    // 循环左移操作以增加随机性
    for (size_t i = 0; i < CODE_DIMENSION; ++i) {
        codeWord[i] = rotateLeft(codeWord[i], 6); // 循环左移6位
    }

    // 将码字分配给初始寄存器
    for (size_t i = 0; i < HASH_LENGTH / 4; ++i) {
        state[i] = codeWord[i % CODE_DIMENSION];
    }

    // 消息预处理
    std::vector<uint32_t> words = preprocessMessage(message);

    // 打印预处理后的消息
    std::cout << "Preprocessed Message: ";
    for (const auto& word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;

    // 消息扩展
    extendMessage(words);

    // 打印扩展后的消息
    std::cout << "Extended Message: ";
    for (const auto& word : words) {
        std::cout << word << " ";
    }
    std::cout << std::endl;

    // 迭代压缩
    compress(state, words);

    // 将32位整数转换为256位哈希值
    std::vector<uint8_t> hash(HASH_LENGTH);
    for (size_t i = 0; i < HASH_LENGTH / 4; ++i) {
        uint32_t word = state[i];
        for (size_t j = 0; j < 4; ++j) {
            hash[i * 4 + j] = word >> (24 - 8 * j);
        }
    }

    return hash;
}

int main() {
    std::vector<uint8_t> message = { 'q', 'y', 'x' };
    std::vector<uint8_t> hash = hrhf(message);

    std::cout << "Hash Value: ";
    for (auto b : hash) {
        printf("%02x", b);
    }
    std::cout << std::endl;

    return 0;
}

运行结果:

image-20240730151621899

2.3 创新部分

(1)循环左移位数的优化: 通过调整循环左移位数可以进一步提升哈希值的随机性。实验结果显示,在循环左移6位时,信息熵数值最高,这表明构造的初始常量值随机性最高,符合HRHF算法的设计目标。

(2)迭代结构的优化: 通过优化迭代结构,提升了算法的执行效率。实验结果表明,在输入消息长度为401080字节的条件下,HRHF算法可以在1秒内完成4502000次运算,与SM3算法的运算效率基本一致,这表明HRHF算法可以支持快速运算。

2.4 对比实验结果

在相同的迭代结构下,HRHF算法的输出哈希值熵值相对于SM3算法有所增加,同时在哈希值长度都为256位的情况下,HRHF算法的轮函数复杂性更高,所产生的哈希值信息熵也高于SHA-256算法,这表明HRHF算法基于线性分组码在哈希值长度和迭代结构之间达到了有效的平衡,使得哈希值具有更高的随机性,同时也更好地隐藏了输入输出之间的关联性。 HRHF算法在运算效率和内存损耗方面也表现出了优势。

2.5 Python代码实现

import struct

# 哈希值长度
HASH_LENGTH = 32  # 256 bits

# 线性分组码参数
CODE_LENGTH = 32  # 码长
CODE_DIMENSION = 6  # 维度

# 生成矩阵初始化
def generate_matrix():
    matrix = [[0] * CODE_LENGTH for _ in range(CODE_DIMENSION)]
    # 示例矩阵
    for i in range(CODE_DIMENSION):
        matrix[i][i] = 1
    return matrix

# 生成码字
def generate_code_word(matrix):
    code_word = [0] * CODE_LENGTH
    # 使用生成矩阵生成码字
    for i in range(CODE_LENGTH):
        for j in range(CODE_DIMENSION):
            # 模2加法
            code_word[i] ^= matrix[j][i]
    return code_word

# 循环左移
def rotate_left(value, shift):
    return ((value << shift) & 0xFFFFFFFF) | (value >> (32 - shift))

# 消息预处理
def preprocess_message(message):
    extended_message = list(message) + [0x80] + [0x00] * 8  # 添加长度占位符
    words = []
    for i in range(0, len(extended_message), 4):
        word = 0
        for j in range(min(4, len(extended_message) - i)):
            word |= extended_message[i + j] << (24 - 8 * j)
        words.append(word)
    return words

# 消息扩展
def extend_message(words):
    # 确保words至少有16个元素
    while len(words) < 16:
        words.append(0)  # 添加零填充
        
    while len(words) < 128:
        w = words[-1]
        w16 = words[-16]
        words.append((w16 ^ rotate_left(w16, 9) ^ rotate_left(w16, 17)) ^
                     (rotate_left(w, 15) ^ rotate_left(w, 23)))

# 布尔函数
def ff(x, y, z, j):
    if 16 <= j <= 63:
        return x ^ y ^ z
    else:
        return (x & y) | ((~x) & z)

# 布尔函数
def gg(x, y, z, j):
    if 16 <= j <= 63:
        return x ^ y ^ z
    else:
        return (x & y) | (x & z) | (y & z)

# 压缩函数
def compress(state, words):
    for i in range(64):
        # 中间变量更新
        ss1 = rotate_left(state[0], 7) + rotate_left(state[4], 12)
        ss1 &= 0xFFFFFFFF  # Ensure 32-bit
        ss2 = ss1 ^ rotate_left(state[0], 12)
        tt1 = ff(state[0], state[1], state[2], i) + state[3] + ss2 + words[i]
        tt1 &= 0xFFFFFFFF  # Ensure 32-bit
        tt2 = gg(state[4], state[5], state[6], i) + state[7] + ss1 + words[i + 64]
        tt2 &= 0xFFFFFFFF  # Ensure 32-bit

        # 状态寄存器更新
        state = [
            state[1],
            state[2],
            state[3],
            tt1,
            state[5],
            state[6],
            state[7],
            tt2
        ]
    return state

# 主算法
def hrhf(message):
    state = [0] * (HASH_LENGTH // 4)  # 初始化寄存器
    matrix = generate_matrix()
    code_word = generate_code_word(matrix)

    # 循环左移操作以增加随机性
    for i in range(CODE_DIMENSION):
        code_word[i] = rotate_left(code_word[i], 6)  # 循环左移6位

    # 将码字分配给初始寄存器
    for i in range(HASH_LENGTH // 4):
        state[i] = code_word[i % CODE_DIMENSION]

    # 消息预处理
    words = preprocess_message(message)

    # 消息扩展
    extend_message(words)

    # 迭代压缩
    state = compress(state, words)

    # 将32位整数转换为256位哈希值
    hash_value = bytearray(HASH_LENGTH)
    for i in range(HASH_LENGTH // 4):
        word = state[i]
        for j in range(4):
            hash_value[i * 4 + j] = (word >> (24 - 8 * j)) & 0xFF

    return hash_value


if __name__ == "__main__":
    message = b'qyx222'
    hash_value = hrhf(message)

    print(hash_value.hex())

image-20240801095925091

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

移动硬盘无法访问怎么修复?

移动硬盘是一种方便的存储设备&#xff0c;但有时可能会遇到无法访问的问题。这不仅影响工作效率&#xff0c;还可能导致数据丢失。本文将详细介绍在Windows系统中移动硬盘无法访问怎么修复&#xff0c;帮助您恢复数据和硬盘功能。 移动硬盘无法访问的常见原因 硬盘故障&#…

1998-2023年上市公司金融/信贷/资本资源错配程度数据(含原始数据+计算代码+结果)

1998-2023年上市公司金融/信贷/资本资源错配程度数据&#xff08;含原始数据计算代码结果&#xff09; 1、时间&#xff1a;1998-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、year、应付账款、负债合计、利息支出、行业代码、是否ST或PT、上市日期…

Scott Brinker:Martech中的AI会让买家体验更好还是更糟?这取决于…….

Martech中的AI会让买家体验更好还是更糟&#xff1f; 你怎么知道自己正处于炒作周期的顶峰&#xff1f;当手段大于目的。 Martech专业人士和营销运营领导者正被推动将人工智能应用于营销——将其用于任何事情&#xff01;——相信人工智能的自动化和加速&#xff0c;尤其是生…

通过EasyExcel设置自定义表头及设置特定单元格样式、颜色

前言 在项目开发中&#xff0c;我们会遇到各种文件导出的开发场景&#xff0c;但是这种情况并都不常用&#xff0c;于是本人将自己工作中所用的代码封装成工具类&#xff0c;旨在记录工具类使用方法和技术分享。 实战代码 导出效果&#xff1a; 1、导入依赖 <dependency&g…

开发指南058-JPA多数据源

一般情况下&#xff0c;一个微服务只链接一个数据库&#xff0c;但是不排除有些情况下需要链多个库。链多个库比较复杂&#xff0c;介绍如下&#xff1a; 1、nocas中要配置多数据源 白框内为正常的单数据库情况。下面增加标识&#xff08;可以任意起&#xff0c;这里为eva)&…

Maven入门:自动化构建工具的基本概念与配置

一、什么是Maven 目前无论使用IDEA还是Eclipse等其他IDE&#xff0c;使用里面 ANT 工具帮助我们进行编译&#xff0c;打包运行等工作。Apache基于ANT进行了升级&#xff0c;研发出了全新的自动化构建工具Maven。 Maven使用项目对象模型&#xff08;POM-Project Object Model&…

ARM基础---编程模型---ARM汇编

一、编程模型 1.1.数据和指令集 1.数据 ARM 采用的是32位架构。 ARM 约定:Byte &#xff1a; 8 bits Halfword &#xff1a; 16 bits (2 byte)Word : 32 bits (4 byte)Doubleword 64-bits&#xff08;8byte&#xff09;&#xff08;Cortex-A处理器&#xff09; 2.指令 ARM…

红日靶场vulnstack (三)

环境搭建 直接把靶机下载下来后&#xff0c;配置环境如下&#xff0c;直接Centsos配置多一张网卡NAT模式就行。 //只有这两台主机IP和图片不同&#xff0c;其它都是一样的&#xff0c;因为图片是拿别人的 kali&#xff1a;192.168.145.171 Centos&#xff1a;192.168.145.130…

https和harbor仓库跟k8s

目录 https 做证书 harbor仓库 https https是加密的http&#xff0c;它的端口是443&#xff0c;它的协议是tcp协议。建立连接和普通的tcp是一样的&#xff0c;都是三次握手和四次挥手&#xff0c;但是它三次握手之后有一个步骤&#xff1a;SSL或者TLS握手的过程&#xff0c…

DAMA数据管理知识体系(第4章 数据架构)

课本内容 4.1 引言 概要 数据架构考虑方面 数据架构成果&#xff0c;包括不同层级的模型、定义、数据流&#xff0c;这些通常被称为数据架构的构件数据架构活动&#xff0c;用于形成、部署和实现数据架构的目标数据架构行为&#xff0c;包括影响企业数据架构的不同角色之间的协…

vue3+ts 实现模板表格文件下载~

1、效果图&#xff1a; 2、创建点击事件&#xff0c;并发起请求&#xff0c;获取模板表格文件下载url地址。 //组件 <a-button class"btn btn_width" click"download"> 下载模板 </a-button>// 文件模板下载 import { getTemplate } from /ap…

JAVA读写Excel(jxl,poi,easyExcel)

目录 一、需求描述 二、具体操作Excel的常用方法 方法一&#xff1a; 使用jxl 方法二&#xff1a; POI 方法三&#xff1a;EasyExcel 三、总结 一、需求描述 前端有时候会传送 Excel 文件给后端&#xff08;Java&#xff09;去解析&#xff0c;那我们作为后端该如何实现…

Linux内核源码-USB驱动分析

基础层次详解 通用串行总线&#xff08;USB&#xff09;主要用于连接主机和外部设备&#xff08;协调主机和设备之间的通讯&#xff09;&#xff0c;USB 设备不能主动向主机发送数据。USB 总线采用拓扑&#xff08;树形&#xff09;&#xff0c;主机侧和设备侧的 USB 控制器&a…

《亿级流量系统架构设计与实战》第十二章 评论服务

评论服务 一、概述二、单级评论模式1、模型设计2、分库分表必要性3、高并发问题 三、二级评论模式1、模型设计2、评论审核与状态3、按照热度排序4、评论读取流程图5、架构总览 四、盖楼评论模式1、数据库递归查询2、数据库保存完整楼层3、图数据库 内容总结自《亿级流量系统架构…

关于IDEA的快捷键不能使用的原因

有时候IDEA的快捷键用不了&#xff0c;这时应该是快捷键发生冲突了&#xff0c;重新设置一下即可。以批量修改变量名称的shift f6为例&#xff08;我的这个快捷键用不了&#xff09;&#xff1a; 初始的rename的快捷键为shift f6 这个快捷键是冲突的&#xff0c;所以我们需要…

探索PDF的奥秘:pdfrw库的神奇之旅

文章目录 探索PDF的奥秘&#xff1a;pdfrw库的神奇之旅背景&#xff1a;为何选择pdfrw&#xff1f;pdfrw是什么&#xff1f;如何安装pdfrw&#xff1f;五个简单的库函数使用方法场景应用&#xff1a;pdfrw在实际工作中的应用常见问题与解决方案总结 探索PDF的奥秘&#xff1a;p…

安防监控视频平台LntonAIServer视频智能分析平台新增视频质量诊断功能

随着安防行业的快速发展&#xff0c;视频监控系统已经成为维护公共安全和个人隐私的重要工具。然而&#xff0c;由于各种因素的影响&#xff0c;视频流的质量可能会受到影响&#xff0c;从而导致监控效果不佳。为了解决这一问题&#xff0c;LntonAIServer推出了全新的视频质量诊…

基于.NET6的WPF基础总结(下)

目录 一、集合控件 1. ListBox可选项列表 2. ListView数据列表控件 3. DataGrid数据表格控件 4. ComboBox下拉框控件 5. TabControl 6. TreeView 树形控件 7. Menu菜单 8. ContextMenu上下文菜单 二、图像控件 1. Ellipse 椭圆 2. Line线段 3. Rectangle矩形 4.…

如何打造中小学在线教学平台?Java SpringBoot集成Vue,教育资源管理新篇章

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于Transformer架构训练LLM大语言模型:Transformer架构工作原理

视频讲解&#xff1a;Transformer架构的工作原理讲解_哔哩哔哩_bilibili 一 Transformer架构总体架构 1 总体架构图 总体架构说明&#xff1a; 输入层 词嵌入&#xff08;Word Embeddings&#xff09;: 输入文本中的每个词都被映射到一个高维空间中的向量&#xff0c;这些向…