DH密钥交换算法因为不能验证数据的来源,所以不能抵御中间人击.
如果需要安全强度更高的非对称加密算法,可以采用Ecc椭圆曲线加密算法或者使用广泛的RSA加密算法.
不对称加密算法主要用于在公共网络安全的数据传输.
不对称加密算法关键部分在于大整数数学函数库的使用.
C/C++实现的DH算法动态链接库,需要64位的可以自己手动编译.
github地址: https://github.com/gesneriana/DiffieHellman
在C#中调用C/C++ DH算法的示例 github地址:
https://github.com/gesneriana/DHTest
至于在Java以及Android 中怎么调用可以参考我的另一篇blog,另一篇blog介绍的是Ecc加密算法.附上blog地址:
http://blog.csdn.net/qq_20202715/article/details/52129810
顺便提一下,本人找工作,会的技术有C#,Java,ASP.NET,Java EE,Android,WinForm,C/C++,Sql Server,Oracle,Mysql,JSON,Java Script,Html,Css,Ajax,JNA,XML,Http,TCP/UDP,IIS,多线程,也使用过一些百度地图API之类的. 目前在杭州西湖区,为何投了那么多简历都无人看,自认为我的 技术也不算是很差.学习能力也还可以.如果需要我可以去自学C/C++的FFMpeg音视频编解码开源框架等技术.并且可以适配多种平台.如果需要也可以适配移动平台.
DH密钥交换算法因为不能验证数据的来源,所以不能抵御中间人击.如果需要安全强度更高的非对称加密算法,可以采用Ecc椭圆曲线加密算法或者使用广泛的RSA加密算法. 不对称加密算法主要用于在公共网络安全的数据传输. 不对称加密算法关键部分在于大整数数学函数库的使用. C/C++实现的DH算法动态链接库,需要64位的可以自己手动编译. git
因为最开始的代码是一个int存储一bit数据,后面修改代码结构,使用一个char存储8比特数据时,偷了一下懒,用了先前的查找表直接生成了char数据,理论上对实验结果没有影响。
代码结构说明:
1.用visual studio2022社区版编译,直接点击.sln文件即可
2.头文件
2.1 头文件中Bit_Format_查找变参考-----即为一个int存储一个比特数据,
2.2 头文件des.h包含所有函数即用到的全局变量,其中查找表存储在uint64_t变量中(ip_char,e_char等)
3.源文件
3.1 Array.cpp/base_fun_quick.cpp即为DES基本
算法
所用到的S/P/E盒等矩阵数组,和int到char转换/各个部件的基础
实现
函数
3.2 D_E_Quick.cpp即为快速
实现
的加
密
模块,其中核心部分为轮函数for循环,加
密
速度提升也集中在这里,这里是直接调用了生成的查找表进行加
密
3.3 Find_Table.cpp即为查找表的生成,数据存储在全局变量中用于3.2中的调用
3.4 sub_key.cpp就是子
密
钥
生成函数,有详细注释不多说了
Diffie-Hellman
算法
是第一个公开
密
钥
算法
,早在 1976 年就发现了。其安全性源于在有限域上计算离散对数,比计算指数更为困难。该
算法
可以使两个用户之间安全地
交换
一个
密
钥
,但不能用于加
密
或解
密
信息。
该
算法
是一种建立
密
钥
的方法,并非加
密
方法,但其产生的
密
钥
可用于加
密
、
密
钥
管理或任何其它的加
密
方式,这种
密
钥
交换
技术的目的在于使两个用户间能安全地
交换
密
钥
(KEY)以便用于今后的报文加
密
。该
算法
需要公开两个参数:质数 n 和其原根 g,同时通信双方 A 和 B 随机选择自己的私
钥
x 和 y,通过
交换
g
(1) 选择公共数p,a;
(2) 用户Alice选择一个秘
密
数Xa,并将自己的公
钥
Ya = (a^Xa) mod p发送给用户Bob
(3) 用户Bob选择一个秘
密
数Xb,并将自己的公
钥
Yb = (a^Xb)mod p发送给用户Alice
(4) Alice计算 共享
密
钥
Ka = (Yb^Xa) mod p
(5) Bob计算 共享
密
钥
Kb =(Ya^Xb) mod p
(6) 此时 Ka =Kb
程序
实现
#include<iostream&
1、Diffie-Hellman
算法
简介
Diffie-Hellman
算法
(以下简称为:DH
算法
),是最早的
密
钥
交换
算法
之一,它使得通信的双方能在非安全的信道中安全的
交换
密
钥
,用于加
密
后续的通信消息。
起基本流程原理如下:
假定小明和小红期望在一个不安全的网络中协商一个共同的
密
钥
,那么进行如下步骤:
两人先说好大素数(质数)p和它的原始根g。
小明随机产生一个数a,并计算A = p^a mod g, 发送给小红。
小红随机产生一个数b,并计算......
DH
密
钥
交换
算法
是一种基于离散对数问题的公
钥
密
码体制,其核心思想是:双方通过
交换
公共信息来生成一个共享的
密
钥
,该
密
钥
只有双方知道,达到了保
密
通信的目的。下面是C语言
实现
DH
密
钥
交换
算法
的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义素数p和底数g
#define p 23
#define g 5
// 计算a^b mod p
int mod_exp(int a, int b, int p) {
int res = 1;
while (b > 0) {
if (b & 1) {
res = (res * a) % p;
a = (a * a) % p;
b >>= 1;
return res;
int main() {
int alice_secret, bob_secret; // 双方的私有
密
钥
int alice_public, bob_public; // 双方的公共
密
钥
int shared_secret_alice, shared_secret_bob; // 双方的共享
密
钥
// 双方选择各自的私有
密
钥
alice_secret = 6; // 可以随机生成
bob_secret = 15; // 可以随机生成
// 计算双方的公共
密
钥
alice_public = mod_exp(g, alice_secret, p);
bob_public = mod_exp(g, bob_secret, p);
// 双方
交换
公共
密
钥
shared_secret_alice = mod_exp(bob_public, alice_secret, p);
shared_secret_bob = mod_exp(alice_public, bob_secret, p);
// 检查共享
密
钥
是否相同
if (shared_secret_alice == shared_secret_bob) {
printf("共享
密
钥
为:%d\n", shared_secret_alice);
} else {
printf("
密
钥
交换
失败!\n");
return 0;
以上代码中,我们选择了一个素数p和一个底数g,双方各自选择一个私有
密
钥
,然后计算出自己的公共
密
钥
,并
交换
公共
密
钥
,最后通过计算得到共享
密
钥
。
需要注意的是,在实际应用中,需要使用更大的素数p和更复杂的计算方法来确保安全性。
Star_Li_92:
Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll
zhanyd:
Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll
一睡六七年
Android Studio 通过JNA调用 Clang编译的so库,以及Java JNA 调用x64dll,C# dllimport调用x86dll
一睡六七年