到目前为止,我主要看到了Python (因为简单)和C(因为效率)用于加密编程。但是有一种不同的编程语言叫做函数式编程语言。哈斯克尔就是一个例子。这些语言没有副作用,可以证明是正确的。我想知道当用于加密应用程序时,这些编程语言是否会比“普通”编程语言有什么好处。是这样吗?如果是,为什么不更频繁地使用呢?
发布于 2021-05-21 10:16:10
这些语言没有副作用。
嗯,是的,算是吧。它们也是较高级别的语言,在这些语言中,您没有(同样多的)控制时间或擦除内存。这些都是密码家担心的副作用,而不是你所指的数学副作用。
我想知道当用于加密应用程序时,这些编程语言是否会比“普通”编程语言有什么好处。
就我个人而言,我认为任何提供内存保护的高级语言实际上都是安全应用程序的一个要求。这种内存保护通常由函数语言提供。它可能比具有可变变量值的高级语言更好。
但是,对于密码原语来说,只要有可用的机器代码,当然也可以使用本机指令,这是有意义的。我已经看到,在这种语言上,位操作通常要慢得多。我们说的是巨大的数字。例如,如果密码原语编程正确(假设性能下降了2倍),Java和C#已经比C慢得多。大多数其他的解释语言都比这慢得多。
函数语言可能带来的性能优势--比如传递函数的延迟执行--对密码原语没有帮助--如果不是完全危险的话。
我想知道当用于加密应用程序时,这些编程语言是否会比“普通”编程语言有什么好处。是这样吗?如果是,为什么不更频繁地使用呢?
在这里,我们必须对“加密应用程序”和“密码原语”进行区分。我认为在高级语言中经常使用经过良好测试的本机函数库。例如,在更高级别的语言(如Python )中使用了许多OpenSSL包装器库。我认为这是有意义的,尽管对使用过的本机库进行更多的(数组)边界测试是有用的。
至于函数式语言:我不认为这种“证明正确”有多大好处。异乎寻常的是,一些边界检查等要进行。但是,否则,通常您可以使用测试向量来显示原语的足够正确性。
我仍然认为纯粹的函数式语言主要适用于数学应用等。就我个人而言,我认为它们足够复杂,以至于大多数开发人员不会将它们用于通用应用程序。这类数学应用程序通常不是需要大量安全性的应用程序类型。
不管你如何看待最后一节(这是相当固执己见的),我们通常不会选择一种基于我们倾向于使用的密码学的语言。安全性应该是应用程序设计的一个组成部分,但通常它不是主要的用例。之所以选择一种语言,主要是因为它符合主要的用例,或者--当然--仅仅是因为开发人员的熟悉程度(纯粹的功能语言仍然不是最流行的语言)。
发布于 2021-05-21 22:25:14
“被证明是正确的”在70年代和80年代都很流行。它基本上已经死了,名誉扫地,只在理论上的计算机科学中生存。这个问题不是技术性的,而是一个根本的概念上的失误,应该是显而易见的。
“证明正确”的第一个问题是定义什么是“正确”。这只能通过编写算法来完成--简而言之,就是编写一个程序。因此,您将一个程序定义为“正确”,即它是否与第二个程序匹配。你怎么知道第二个是对的?答:你没有。
对此的现代答案是测试。我们知道(而且我们有证据)高质量的测试,包括角落案例,很可能会发现编码错误。我们无法证明没有but,但我们可以对其设置适当的统计限制。
随之而来的更深层次的问题是“我们是否得到了正确的定义,我们认为什么是正确的?”在实践中,我们现在知道,大多数严重的故障通常不是来自编码错误,而是来自不正确的规范。正式的证明只会证明程序做了指定的事情,而不是达到了预期的目的。只有测试才能证实这一点,而可接受的测试通常需要是定性的(“感觉够快吗?”)而不是定量的(“它在100 in以下运行吗?”)。
https://crypto.stackexchange.com/questions/90091
复制相似问题