system: [SYSTEM]

user: 3. 密码领域的DSL 目前，加密应用程序大都采用传统的通用编程语言编写，如C/C++。这些语言没有支持加密算法测试和诊断的内置功能。 密码领域专用语言与其他计算机通用语言相比，其显著特点与密码算法的基本构成相关，包括几方面：其一是数据和运算，密码算法定义的数据如移存器、S盒、任意数据规模的序列，以及定义其上的抽取、置换、截断、填充等非常专业的运算；其二是逻辑结构，密码算法本身非常强的逻辑结构如分层、对称、迭代、混淆等。此外，还有密码算法特有的精准描述和正确性、一致性验证。而与其他计算机编程语言不同的是，大多数计算机程序应用中的BUG可以在使用过程中发现并修正，而密码算法逻辑中如果存在BUG，其后果严重且难以弥补。 当以通用语言实现加密算法时，由于缺乏从概念到代码的更直观的转换的构造，会面临许多问题。 在国内，描述密码算法的工具大多为C语言主宰。但是，C语言并不适合密码算法的描述，例如，由于缺乏适合移位寄存器的数据类型，为了用C语言的现有类型拼接出一个移位寄存器，就有多种多样的拼接方法。又例如，加密算法需要大量处理对于数据的捕获操作。以位操作为例，程序员需要管理是数据的位而不是字节。虽然在大多数编程语言中可以实现这一要求，但实现起来有点笨拙。例如，当给定要在C中加密的字符串时，必须使用移位运算符来访问特定的位，可以将位表示为其字符阵列以改善对位的访问，但是当需要位实际表示为数字时，例如DES中的索引或整数，这种表示又会引入新的困难。 而且，密码专家对C语言往往既不精通也不信任，通常密码算法设计好之后，需要找两个程序员背对背的编写代码，除了向其提供算法框架图，还需要花时间列公式、讲解，如果两个程序员给出了不同的结果，就要检查是谁的问题，这是一个非常繁琐的过程。 因此，在密码学领域，迫切需要一种面向加密算法的领域编程语言。 3.1. Cryptol DSL 国际上，由Galois公司设计的加密算法编写工具Cryptol DSL [ 20 ] [ 21 ] ，2008年正式发布。该语言工具最初由Galois为美国国家安全局(NSA)的可信系统研究小组开发，作为指定加密算法的公共标准 [ 21 ] [ 22 ] 。 Cryptol是一种可执行的DSL，设计人员可以随着设计的发展，逐步测试其程序，其代码转换还可直接应用到硬件电路设计上。 Cryptol的使用者包括美国军方和美国政府，也被当作一种密码专业的学习工具。该工具集可以生成表示规范和实现的正式模型。其公开的实验表明，用于AES-256的Cryptol规范生成并在电子密码本模式下运行的算法核心吞吐量超过16 Gbps。 值得注意的是，Rockwell Collins/Galois团队可以在3个月内，在新硬件上设计，实施，模拟，集成，分析和测试复杂的CEA，包括AES-256和Galois Counter Mode (GCM)。这样的应用，大大减少了在新平台上完成新密码算法设计的时间。 Cryptol实现算法类似于数学的规范，它比在通用语言里的实现过程更加的严密。如果将一种规范编写进Cryptol里，程序员就可以为自己的程序生成测试矢量、证明定理、验证等效，甚至能生成代码。 与学习任何新的语言范例一样，最初使用Cryptol代码工作是困难的，但是一旦它变得舒适，它感觉比C好。它的实用性变得越来越明显，代码部分需要单个位操作，例如位串的排列。然而，正如预期的功能语言一样，这种语言由于速度权衡和语言结构的不透明性而主要用于研究或验证其他实现。 为了构建这类算法的更易理解的表示，Galois公司开发附带了一个工具套件，可用于验证实现用C语言编写的算法，如C语言。要明确的是，这种语言背后的意图不是用作密码算法准备就绪后的实现，而是作为一种替代方案，提供代码的清晰度以及可证明的功能实现。在为这些类型的密码算法进行原型设计，验证和创建参考的时候，这样的系统将是有用的，这与用于生产用途的其他DSL(例如Tensorflow [ 23 ] )有所不同。 3.2. PCL PCL是一款国内自主研发的密码领域专用语言 [ 24 ] 。PCL的研发始于Cryptol发布之初，是一款二维图示化密码算法设计的工具软件，其图形化编辑在Visio平台上完成，通过绘制图形而不是编写代码的方式描述密码算法。 按照DSL的分类方法，PCL语言属于“非文本的内部DSL”。“非文本”是指该语言使用了图形化表述，“内部DSL”是从一种宿主语言构建而来而不是从零开始构建的语言。 PCL使用Cryptol语言为宿主语言，密码领域需要的解决方案模型，即元语言抽象阶段由Cryptol语言完成，图形化编辑则在Visio上开发完成。 PCL设计了从图形到Cryptol语言的转换机制：数据流动控制、数据类型匹配、环节代码生成、页面代码封装、回馈数据处理、迭代机制实现等，其正确性建立在Cryptol是纯函数式的语言结构上。而编码环节(无论是元环节或复合环节)是模具在Cryptol语句集合上的映射，正确性由Cryptol语言语法结构的合理性保障。 以PCL语言为工具的算法设计流程如图1。 PCL还设计了Cryptol语言的运行控制机制。把图形转换到Cryptol语言之后，控制机制能够启动或中断Cryptol的运行，定位每一个中间数据点，能够控制抽取数据、标识数据和存档数据。 在PCL平台上，密码算法设计者可以勾勒算法框架、修改算法逻辑、设计或调整变换环节，无需程序员参与模拟即可实时获得实验数据，特别适用于独立不间断的思维过程，以及用于设计或分析时同行之间的交流；对于密码算法的学习者或分析者来说，通过算法逻辑结构图的直观表达能够洞悉设计者的基本思路，对密码算法进行编辑和重构。 PCL设计有编辑授权机制。鉴于密码算法对数据和变换的敏感性，任何对算法的实质修改必须由授权用户进行，拒绝任何非法修改，合法修改信息会以数字签名的方式记录在算法的页面属性中，用于安全审计。 在PCL之前，包括Cryptol在内，没有任何语言可以这样直接描述密码算法的逻辑结构。密码专家们只能以示意图或草图配上必要的数学表达式和文字说明来描述。然而计算机是不能理解示意图这样的表达形式，算法的具体实现只能交给程序员用C语言去完成。实际上密码专家对C语言既不精通也不信任，往往要找两个程序员背对背的编写代码，除了提供算法框架图，还有花时间列公式、讲解，如果两个程序员给出了不同的结果，就要检查是谁的问题，这是一个十分繁琐的过程。 图1. 以PCL语言为工具的算法设计流程 PCL的基本特点是图形化描述密码算法的逻辑结构。在密码算法框架结构层面上，能满足对密码算法复杂逻辑结构的分层描述。各类密码变换，可以使用特定的模具描述，展现在逻辑图上。 逻辑结构图是密码算法最具代表性的特征，例如DES的Feistel结构、IDEA的乘加结构，都以图的形式直观描述数据的变换过程。在密码算法设计者构思一个密码算法时一定会先确定算法的逻辑结构；而算法的分析者在了解一个密码算法时也一定从逻辑结构开始，密码专家的在交流现场是，面对的一定也是算法的逻辑结构图而不是描述密码算法的程序语句序列。 模具是PCL从密码变换的繁杂运算中抽象出来的语义模型，模具是密码算法描述的基本单位，其多态性只表现运算的本质而隐藏了运算细节(如算子规模、数据跨界、变量管理等)，使得复杂的密码变换呈现出极其简约符号形式，和逻辑结构描述连贯构成完备的语言整体。 PCL建立在Visio平台上，其编辑界面分模具栏、编辑栏和属性栏三部分，如图2。 图2. PCL编辑界面 在PCL中，模具有6组(分别是binary、JASP、LFSR、PageF、Line、SBoxF)，以及输入输出端子。其中，binary涵盖了所有常用的二元变换函数；JASP能将多个输入数据合成一个大规模数据(join/append)，可以把一个数据等分为几个小规模数据(split)，可以按照置换表把输入数据置换输出(permute)，还可以把以上3种操作进行组合运用，构造更复杂的函数；LFSR可工作在二元域或2 n 元域上，支持乘法电路和除法电路，二元域互反多项式转换。再通过属性或设置数据，可自动选择适合的工作方式，有：规则移存器、钟控移存器(走停、多步)、带输入移存器、钟控 + 带输入移存器、作为反馈多项式的特例，也可做成延时器；pageF把一个页面包装为一个环节，使其可以以步进方式或序列方式运行；Line是连接任意数据(如Bit向量，向量的向量、向量的矩阵，矩阵的矩阵)通过的桥梁；SboxF支持表达式和真值表两种等价表达。 PCL编辑过程：用户把模具从模具栏中拖入编辑界面，在属性栏中设定模具属性使之成为一个编码环节，用连接线(模具的一种)把编码环节连接起来，构成算法(子算法)： PCL运行过程：在编辑界面上用鼠标点击进入运行状态，界面见图3。运行状态下，用鼠标移到可以查看每条数据线上数据类型，可以点击数据线抽取数据，数据抽取后显示在浮动窗中。对每一条数据线都可以实时查看。如果必要，点击调试面板上运行算法按钮，可以把该数据抽取做为数据文件存储。数据文件中记录了该数据的算法名称、抽取位置、抽取位置、数据规模以及运行平台和操作人员的信息，便于存档。 图3. PCL运行界面