ssh秘钥交换详解与实现 diffie-hellman-group-exchange-sha

本文详细讲解了SSH中的DH秘钥交换算法,特别是diffie-hellman-group-exchange-sha256,涉及了Diffie-Hellman、SHA256、RSA等加密算法。通过实例介绍了DH算法的步骤,包括大素数生成、密钥计算等,并阐述了在SSH协议中的应用和数据包交换过程。
摘要由CSDN通过智能技术生成

    ssh的DH秘钥交换是一套复合几种算法的秘钥交换算法。在RFC4419中称为diffie-hellman-groupX-exchange-shaX 的算法(也有另一种单纯的 rsaX-shaX 交换算法)。本文就以diffie-hellman-group-exchange-sha256为例,详尽地讲解整个完整的秘钥交换过程。

    笔者在RFC上和网上看了很久,也只是做了一个大致了解,对实现的帮助不大。实际在实现过程中,有太多的细节需要注意,在很多细节的分歧中,需要自己抱着勇气去测试。(原谅我不看openssh源码和使用openssl库,我只想全部自己实现整个ssh)。在diffie-hellman-group-exchange-sha256中,数据的类型非常地重要,因为涉及到hash运算,一定要区别好整数与字符串还有进制。一个小的不同都会导致hash的结果大不一样,hash错了以后的工作都是徒劳。

    diffie-hellman-group-exchange-sha256的整个过程中一共要用到的秘钥交换算法有:diffie-hellman、sha256、ssh-rsa(或其他算法协商的host key,不是单纯的rsa,虾米告诉我ssh用的是RSASSA-PKCS1-v1_5 scheme标准)。而要支持这些加密算法,又需要很多基础算法:多进制大整数、高精度运算、快速模幂、离散算法...(还好自己有一定的acm基础,本来当初是打算学习并实现ssh协议,结果在算法的道路上越走越远,这次就当锻炼自己了。表示以后要好好运用面向对象技术,再也不实现不必要的底层了,以后涉及到安全传输就直接用openssl了)

    以下为各个算法的讲解,先说最重要的几个基础数据结构与计算方法:

    1、mpint: 二进制补码格式的多精度整数,储存为一个字符,每个字符8位,从高位到低位,负数最高位为1,正数最高位为0(只用到整数)。数据格式为:4字符长度+该长度字符的数值。例如:a1d8:00 00 00 03 00 a1 d8;   4:00 00 00 02 00 04

    2、多进制大整数:平时以16进制存储,这样便于使用的时候少转化,转二进制也很快,实现很麻烦,我虽然有自己的大整数模板,但终归是不放心,我就用cryptopp自带的大整数改写过来用(人家可是用的汇编计算的)。

    3、高精度运算:主要实现加法乘法和求余即可,因为dh和rsa只需要用到乘法与求余。

    4、快速模幂:DH算法和RSA算法都会用到相似的运算:a^b%c 。因为b是一个大整数,因此对于他的幂运算我们将b进行二分,然后对a以及a计算后的结果进行计算,这样能省下大量不必要的运算。几个例子:3^8=3*3*3*3*3*3*3*3要进行7次运算。而这样化解(3^4)*(3^4)=(3^4)^2=((3^2)*(3^2))^2=((3^2)^2)^2只需要进行3次运算。第一种方式的时间复杂度是O(n),第二种二分幂的方法时间复杂度是O(logn),当b为10位十进制的整数时,第一种方式要计算10^10次,而用二分幂的方式只需要计算大约30多次。因为我们要求的是余果,所以在进行幂运算的同时就进行模运算,也能极大减少运算量,否则内存可能都装不下那么大的幂果。下面给出代码实现:

    Integer fastpower_comp(Integer a,Integer b,Integer c)
    {
	
	/*sample unused fast power
	Integer re=1;
	for(int i=0;i<b;i++)
	{
		re*=a;
		re%=c;
	}
	return re;
	*/

	//fast power
	Integer n=c;
	c=1;
	while(b!=0)
	{
		if(b%2!=0)
		{
			b=b-1;
			c=(c*a)%n;
		}
		else
		{
			b=b/2;
			a=(a*a)%n;
		}
	}
	return c;
    }

    

    密码算法:

    1、diffie-hellman:

        服务器首先产成两个数GP,P为一个非常大的素数,作为DH算法的G

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值