Cryptography 序言-试图从最初的知识开始构建,限制无限的构建

Cryptography 序言-试图从最初的知识开始构建,限制无限的构建,cryptography,prolog,logic,gnu,Cryptography,Prolog,Logic,Gnu,我试图建立一个知识库,指出攻击者能够发送的消息以获得对某些机密数据的访问(我的示例使用TLS协议的简化版本,这意味着客户端服务器证书Authority SessionKey) 无论如何,如果有人需要进一步解释,请询问 我的问题是: 使用协议发送消息,如下所示: init(Init_1, Init_2, Init_3) 此消息有3个参数。 每个参数都需要有一个特殊格式。 例如: nonce(Init_1) publicKey(Init_2) Init_3 = sign(SignedData, P

我试图建立一个知识库,指出攻击者能够发送的消息以获得对某些机密数据的访问(我的示例使用TLS协议的简化版本,这意味着客户端服务器证书Authority SessionKey)

无论如何,如果有人需要进一步解释,请询问

我的问题是:

使用协议发送消息,如下所示:

init(Init_1, Init_2, Init_3)
此消息有3个参数。 每个参数都需要有一个特殊格式。 例如:

nonce(Init_1)
publicKey(Init_2)
Init_3 = sign(SignedData, PrivateKey)
SignedData = [Id,PublicKey]
id(Id)
publicKey(PublicKey)
此外,要接受消息并发送以下消息,必须检查防护装置:

ext(Init_3,Init_2) % meaning the signature can be extracted with the second parameter
extractedData(Init_3,Data) % Data is the extracted data from the signature
nth(2,Data,Init_2) % the second atom of the extracted data is the same as the second parameter
最重要的是,攻击者只能发送带有他知道的参数的消息

knows(Init_1),
knows(Init_2),
knows(Init_3)
好的,攻击者有能力获得知识。基本上,他可以读取所有消息,因此他在开始时就知道参数,这是他的初始知识。 默认消息的示例

init(n_c , k_c , sign([c,k_c],k_c-1) )
导致

knows(n_c,1) % the 1 is an artifact which may or may not be needed; tells the depth of the knowledge
knows(k_c,1)
knows(sign([c,k_c],k_c-1),1)
编辑:我删除了关于从加密和/或签名数据中提取数据的长部分。基本上,在收集默认消息并从中断言初始知识之后,每个可解密和可提取的数据都会添加到初始知识中

我现在的问题是: 我想通过对初始知识中的内容进行加密和签名来构建新消息。 这本身是很容易的,但目前会带来无限的知识收获,因为你可以建立这样的东西

enc(enc(enc(enc(enc(...(Data, Key)...)
但是我想把消息构建限制为上面的特殊格式。 在init的示例中,我希望允许

sign([Id,PublicKey],PrivateKey)
,但不是这样

sign(sign([Id,PublicKey],PrivateKey),PrivateKey)
或者更糟的事情

最后但并非最不重要的一点是,以下是我的消息构建或参数生成规则:

knows([FirstData,SecondData],Depth) :-
Depth @> 1,
depth(SecondData,B), A is Depth - B,
knows(SecondData,B), knows(FirstData,A).

knows(enc(Data,Key),Depth) :-
Depth @> 1,
DepthMin1 is Depth - 1,
for(KeyDepth,1,DepthMin1),
isKey(Key),
Data \== enc(_, Key),
    knows(Key, KeyDepth),
knows(Data, DepthMin1).

knows(sign(Data,Signature),Depth) :-
Depth @> 1,
DepthMin1 is Depth - 1,
for(KeyDepth,1,DepthMin1),
isKey(Signature),
Data \== sign(_, Signature),
knows(Signature,KeyDepth),
knows(Data,DepthMin1).
好吧,这可能有点多,但我不知道我能缩短多少。如果有人有一个好主意,请告诉我

编辑:

好吧,也许编程问题有点隐蔽。因此,基本上,我如何将从初始知识knows(Data,1)(使用enc,sign和concatenation[,])生成的消息限制在有限范围内(由上面的特殊格式定义)(即,如果消息首先不包含此模板,则不生成enc(enc(Data,Key),Key)?

您可以为每条消息定义一个“长度”函数,然后使用它首先获取较短的消息

例如,考虑以下内容:

list([]).
list([0|T]):-list(T).
list([1|T]):-list(T).
此代码识别/生成0和1的列表。 如果我们只使用列表(L),我们只会得到零: [],[0],[0,0],[0,0,0]

但是,如果我们对列表使用length/2,我们将得到我们想要的:

?- length(L,X), list(L).
L = [],
X = 0 ;
L = [0],
X = 1 ;
L = [1],
X = 1 ;
L = [0, 0],
X = 2 ;
L = [0, 1],
X = 2 ;
L = [1, 0],
X = 2 ;
L = [1, 1],
X = 2 ;
然而,这并不能消除你不想要的模式;它只会使它稍后出现。在本例中,如果我不希望列表的起始长度为零,那么/2还不够好(尽管如此,它有助于生成“有意义的”结果)

真正的解决办法是创建一个模式识别器来过滤并只获取好消息;这也可以通过使用length来实现,只要在发现有非法模式时将length设置为无穷大即可

另一个解决方案是重新组织谓词。 在本例中,如果将1谓词放在第一位,则会得到以1开头的列表。 或者您可以使用(更多)谓词层,如: 第一个列表([1 | T]:-list(T)


只是一些想法:)

我发现很难在这里看到编程问题。您似乎在谈论一个尚未定义的通信系统,以及描述该系统的“表示攻击者能够发送消息的知识库…”。考虑一个可编程的问题,少关注“我正在尝试……”和“我想……”的概念。嗯……我可能在域中太深了,但是我会再试一次,在文章的末尾看到编辑。为了避免无限重复/嵌套,你不是说“如果消息已经[不]了,就不要生成EnC(EnC(数据,key),key))。是否包含此模板“?