List 利用密码表问题实现GIFT-COFB算法

List 利用密码表问题实现GIFT-COFB算法,list,functional-programming,cryptography,cryptol,List,Functional Programming,Cryptography,Cryptol,我对哈斯克尔的加密方言已经不熟悉了,我也很恼火,因为我不能使用循环。。。 我想实现这样一个数组。。。但我唯一的想法是从[0]索引开始获取每4个元素,并将这个新列表加载到S0。类似地,从列表索引开始,每隔4个元素加载到新的S1数组。Cryptol的类型系统的设计使得您在加密算法中发现的这些类型的位拆分几乎不需要表达。事实上,一旦你习惯了这种风格,缺少循环是一个优点,而不是一个坏处 有多种方法可以编写“初始化”代码。但我会这样做: load : {a} [128][a] -> [4][32][

我对哈斯克尔的加密方言已经不熟悉了,我也很恼火,因为我不能使用循环。。。
我想实现这样一个数组。。。但我唯一的想法是从[0]索引开始获取每4个元素,并将这个新列表加载到S0。类似地,从列表索引开始,每隔4个元素加载到新的S1数组。

Cryptol的类型系统的设计使得您在加密算法中发现的这些类型的位拆分几乎不需要表达。事实上,一旦你习惯了这种风格,缺少循环是一个优点,而不是一个坏处

有多种方法可以编写“初始化”代码。但我会这样做:

load : {a} [128][a] -> [4][32][a]
load(elts) = reverse (transpose cols)
  where cols : [32][4][a]
        cols = split elts
注意,这里的类型比您需要的更通用,但它允许更容易的测试。以下是我在cryptol提示符下得到的信息:

Main> :set base=10
Main> load [127, 126 .. 0]
Showing a specific instance of polymorphic result:
  * Using '7' for type argument 'a' of 'Main::load'
[[124, 120, 116, 112, 108, 104, 100, 96, 92, 88, 84, 80, 76, 72,
  68, 64, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4,
  0],
 [125, 121, 117, 113, 109, 105, 101, 97, 93, 89, 85, 81, 77, 73, 69,
  65, 61, 57, 53, 49, 45, 41, 37, 33, 29, 25, 21, 17, 13, 9, 5, 1],
 [126, 122, 118, 114, 110, 106, 102, 98, 94, 90, 86, 82, 78, 74, 70,
  66, 62, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2],
 [127, 123, 119, 115, 111, 107, 103, 99, 95, 91, 87, 83, 79, 75, 71,
  67, 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23, 19, 15, 11, 7, 3]]
这有点难读,所以这里的格式是:

[[124, 120, 116, 112, 108, 104, 100, 96, 92, 88, 84, 80, 76, 72, 68, 64, 60, 56, 52, 48, 44, 40, 36, 32, 28, 24, 20, 16, 12, 8, 4,  0],
 [125, 121, 117, 113, 109, 105, 101, 97, 93, 89, 85, 81, 77, 73, 69, 65, 61, 57, 53, 49, 45, 41, 37, 33, 29, 25, 21, 17, 13, 9, 5, 1],
 [126, 122, 118, 114, 110, 106, 102, 98, 94, 90, 86, 82, 78, 74, 70, 66, 62, 58, 54, 50, 46, 42, 38, 34, 30, 26, 22, 18, 14, 10, 6, 2],
 [127, 123, 119, 115, 111, 107, 103, 99, 95, 91, 87, 83, 79, 75, 71,  67, 63, 59, 55, 51, 47, 43, 39, 35, 31, 27, 23, 19, 15, 11, 7, 3]]
这正是你想要的结构。现在我们可以专注于:

loadBits : [128] -> [4][32]
loadBits(vector) = reverse (transpose cols)
  where cols : [32][4]
        cols = split vector
请注意,代码与之前完全相同,我们只是将其特定于您想要的类型

希望这能让你开始