您的位置:首页 > 其它

信息安全试验课遇到的一个问题

2015-05-21 17:29 267 查看
最近在学习信息安全试验,偷懒的我,就直接按照书上的算法来写了,根本没有理解算法,但是接连遇到了错误,我开始一直以为是书上算法错了(so arrogant),结果今天单步跟踪了下才发现问题所在,而这个问题其实也是十分典型的。

题目是要求用扩展欧几里得算法求乘法逆元。

首先看下出错地方的算法t1=(u-q*v1)mod m,因为一开始老师要求所有的数据都是unsigned int,所以我压根就没考虑的将所有变量都声明成unsined int,但是书上这里却出现了t1=-13,所以我当机立断改了所有的变量,改成了int,但是结果依然是错的,继续跟踪,还是这个点出错,我这才想起m还是unsigned int的,在求mod的运算的时候前面的-13会被转换成unsigned int类型,也就是INT_MAX-13,用这个数字去求余当然是错的,所以只需要将m改成int类型就可以了,但是调用的时候最好要强制类型转换一下。

下面给出源代码

int Euclid_inv(int a, int m)
{
// step 1
int u = 1, g = a, v1 = 0, v3 = m;
int t3;
do
{
// step 2
int q = g / v3;
t3 = g % v3;
// step 3
if (t3 != 0) {
int t1 = (u - q*v1) % m;
u = v1;
g = v3;
v1 = t1;
v3 = t3;
}
// step 4
} while (t3 != 0);
g = v3;
// step 5
if (g != 1)
return 0; // inverse element did not existed
if (g == 1)
{
if (v1 > 0)
return v1;
else
return m + v1;
}
}

另外这种学习方法很不可取。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐