Matlab:支持非素数模的线性同余解算器?

Matlab:支持非素数模的线性同余解算器?,matlab,cryptography,linear-algebra,symbolic-math,mupad,Matlab,Cryptography,Linear Algebra,Symbolic Math,Mupad,我正在编写一些Matlab代码,对给定的密码系统执行所谓的索引演算攻击(这涉及计算离散的日志值),除了一件小事之外,我已经完成了所有的工作。我不知道(在Matlab中)如何解同余的线性系统mod p,其中p不是素数。而且,这个系统有不止一个变量,所以,除非我遗漏了什么,否则中国剩余定理不会起作用 我问了一个关于mathematics stackexchange的问题,其中包含更多细节/格式化的mathjax。我在那个链接上解决了我问题中的问题,现在我正试图找到一个实用程序,它可以让我解非素数模的

我正在编写一些Matlab代码,对给定的密码系统执行所谓的索引演算攻击(这涉及计算离散的日志值),除了一件小事之外,我已经完成了所有的工作。我不知道(在Matlab中)如何解同余的线性系统mod p,其中p不是素数。而且,这个系统有不止一个变量,所以,除非我遗漏了什么,否则中国剩余定理不会起作用

我问了一个关于mathematics stackexchange的问题,其中包含更多细节/格式化的mathjax。我在那个链接上解决了我问题中的问题,现在我正试图找到一个实用程序,它可以让我解非素数模的同余系。我确实找到了一个套件,其中包括一个支持模运算的解算器,但模必须是素数()。我也尝试过单步修改它来处理非素数,但不管使用什么方法都不行,因为它要求系统的所有元素都有模p的逆

我已经研究过使用Matlab中的功能调用MuPAD函数,但是从我的测试来看,MuPAD函数
linsolve
(它似乎是最好的候选者)也不支持非素数模值。此外,我已经用Maple验证了这个系统是可解的,可以用我感兴趣的整数(8)模,所以可以这样做

更具体地说,这正是我试图在MuPAD中运行的命令:

linsolve([0*x + 5*y + 4*z + q = 2946321, x + 7*y + 2*q = 5851213, 8*x + y + 2*q = 2563617, 10*x + 5*y + z = 10670279],[x,y,z,q], Domain = Dom::IntegerMod(8))

Error: expecting 'Domain=R', where R is a domain of category 'Cat::Field' [linsolve]
如果我将域更改为IntegerMod(23)和IntegerMod(59407),相同的命令将返回正确的值,因此我认为8不合适,因为它不是素数。以下是我尝试上述命令时的输出,其中23和59407都是我的域:

[x = 1 mod 23, y = 1 mod 23, z = 12 mod 23, q = 14 mod 23]

[x = 14087 mod 59407, y = 1 mod 59407, z = 14365 mod 59407, q = 37320 mod 59407]

这些答案是正确的-
x
y
z
q
对应于上面我的Math.StackExchange链接上的一致性系统中的
L1
L2
L3
L4

我想知道您以前是否尝试过使用和,但可能传递了数值而不是符号值。例如,就您所寻找的内容而言,这会返回无意义的结果:

A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
s = mod(linsolve(A,b),8)
但是,如果将数值转换为符号整数,
sym/linsolve
将以有理分数的形式保存所有内容。然后

s = mod(linsolve(sym(A),sym(b)),8)
返回期望的答案

s =

 6
 1
 6
 4
这只是解决了系统的线性系统使用符号数学,就好像它是一个正常的矩阵。对于大型系统来说,这可能会很昂贵,但我想象不出比使用MuPAD或。应返回每个溶液组分分子的模量。我相信,如果模和分母不一致,你会得到一个错误

sym/solve
也可用于以类似方式解决此问题:

L = sym('L',[4,1]);
[L1,L2,L3,L4] = solve(A*L==b);
s = mod([L1;L2;L3;L4],8)
使用
sym/solve
sym/linsolve
的一个可能问题是,如果线性同余问题有多个解决方案(与线性系统相反),此方法可能不会返回所有解决方案

最后,使用MuPAD函数(中国整数余数定理),这里有一些代码试图获得完整的解决方案:

A = [0 5 4 1;1 7 0 2;8 1 0 2;10 5 1 0];
b = [2946321;5851213;2563617;10670279];
m = 10930888;

mf = str2num(strrep(char(factor(sym(m))),'*',' '));
A = sym(A);
b = sym(b);
s = sym(zeros(length(b),length(mf)));
for i = 1:length(mf)
    s(:,i) = mod(linsolve(A,b),mf(i));
end

mstr = ['[' sprintf('%d,',mf)];
mstr(end) = ']';
r = sym(zeros(length(b),1));
for i = 1:length(b)
    sstr = char(s(i,:));
    r(i) = feval(symengine,'numlib::ichrem',sstr(9:end-2),mstr);
end
check = isequal(mod(A*r,m),b)

我不确定这是否是你想要的,但希望它能有所帮助。我认为在MathWorks中加入一个新的解决方案可能是一个好主意,这样MuPAD和其他解算器将来可以更好地处理系统。

我想知道您是否可以在上获得更多关于此类问题的帮助(以及更多关于此主题的内容)?当然,我也会在那里询问,谢谢您的提示!这是一个编程网站,所以展示一些代码和预期的输出总是很有帮助的。例如,在Math.StackExchange链接中显示的4乘4示例中使用的Matlab代码。我不清楚您所说的
linsolve
不工作是什么意思(甚至您所指的三个
linsolve
函数中的哪一个)。是不是你期望不止一个解决方案,而解决方案是?是否有实现此功能的C代码您可能可以创建一个mex函数。感谢您的回复-很抱歉,我之前没有任何代码。我已经添加了我看到的确切问题。如果还有什么我能提供的,请告诉我。我很抱歉-我不熟悉StackOverflow和StackExchange我非常无知,但是你不能用其他数值方法(例如
nlinfit
)来“粗暴地”求解线性系统的近似解吗?这一切看起来都很棒,尤其是关于将矩阵转换为符号的顶部部分-非常感谢!我刚刚尝试在我自己的机器上复制它,但我得到一个错误,linsolve不支持sym参数。这是新功能吗?在尝试了sym/linsolve帮助页面中的示例之后,我使用了7.11.0(R2010b),我得到了相同的错误:“对于'sym'类型的输入参数,未定义函数或方法'linsolve'。所以我猜R2010b中没有sym/linsolve?很抱歉,回复太晚了。多年来,符号数学工具箱Math toolbox发生了很大的变化,因此您可能不应该查看Google提供的在线文档(尽管旧版本的存档文档非常有用)。而是使用
doc
help
功能。即使R201b中不存在
sym/linsolve
,我想您也可以使用上面显示的
sym/solve
版本。您可能需要将矩阵方程转换为四个字符串方程-我不知道。不用担心-谢谢您的回复!实际上我一直在尝试使用solve函数,但是我遇到了问题。我请求帮助解决另一个问题