首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PROLOG中使用crypto_modular_inverse?

如何在PROLOG中使用crypto_modular_inverse?
EN

Stack Overflow用户
提问于 2022-05-18 00:05:14
回答 1查看 68关注 0票数 2

我有一个任务,我必须编码仿射密码,问题是,使用函数crypto_modular_inverse是必需的。

以下是声明:

D (y ) =密码模逆(A)*(y- b) mod m

我搜索了文档,但是信息很少,也没有给出任何例子。

我需要了解这个功能是如何被欢迎的。

EN

回答 1

Stack Overflow用户

发布于 2022-05-18 02:59:00

使用仿射密码的本演练:https://crypto.interactive-maths.com/affine-cipher.html

D (y ) =密码模逆(A)*(y- b) mod m

对于加密密钥值a=5和b=8以及26个可加密字符的字母表,密码模逆是

代码语言:javascript
复制
?- crypto_modular_inverse(5, 26, C).   % a=5 and alphabet length m=26
C = 21

我这样做了,在这里,maplist行进行(A*X+B) mod Mcmi(a)*(y-b) mod m变换,并在其中减去97,这是小写a的ASCII字符代码,使字母从97,98,99下降……到0,1,2.对于密码数学,然后添加97个,使它们返回到可打印的ASCII字符:

代码语言:javascript
复制
:- use_module(library(clpfd)).

affine_a_b_plain_to_cipher(A, B, Plain, Cipher) :-
    string_codes(Plain, PlainCodes),
    maplist({A,B}/[N,M]>>(M #= ((A*(N-97)+B) mod 26)+97), PlainCodes, CipherCodes),
    string_codes(Cipher, CipherCodes).

affine_a_b_cipher_to_plain(A, B, Cipher, Plain) :-
    string_codes(Cipher, CipherCodes),
    crypto_modular_inverse(A, 26, C),
    maplist({C,B}/[N,M]>>(M #= (C*((N-97)-B) mod 26)+97), CipherCodes, PlainCodes),
    string_codes(Plain, PlainCodes).
代码语言:javascript
复制
?- affine_a_b_plain_to_cipher(5, 8, "affine cipher", Cipher).
Cipher = "ihhwvcvswfrcp"

?- affine_a_b_cipher_to_plain(5, 8, "ihhwvcvswfrcp", Plain).
Plain = "affinencipher"

固定字母表以包括空格、大写字母、符号等,是留给读者的练习。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72281913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档