SAP AES encrypt

加密算法简介:

加密技术通常分为两大类:"对称式""非对称式"

对称性加密算法:对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。

非对称算法:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥""私钥",它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给BB将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,BA发送消息时为同样的道理。

散列算法:散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的"散列""消息摘要"(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。

对称性加密算法有:AESDES3DES

用途:对称加密算法用来对敏感数据等信息进行加密

DESData Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。

3DESTriple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

AESAdvanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;AES是一个使用128为分组块的分组加密算法,分组块和128192256位的密钥一起作为输入,对4×4的字节数组上进行操作。众所周之AES是种十分高效的算法,尤其在8位架构中,这源于它面向字节的设计。AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。

非对称性算法有:RSADSAECC

RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的。RSA在国外早已进入实用阶段,已研制出多种高速的RSA的专用芯片。

DSADigital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法。

ECCElliptic Curves Cryptography):椭圆曲线密码编码学。ECCRSA相比,具有多方面的绝对优势,主要有:抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。计算量小,处理速度快。ECC总的速度比RSADSA要快得多。存储空间占用小。ECC的密钥尺寸和系统参数与RSADSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。

散列算法(签名算法)有:MD5SHA1HMAC

用途:主要用于验证,防止信息被修。具体用途如:文件校验、数字签名、鉴权协议

MD5MD5是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。

SHA1:是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的Hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5MD5又基于MD4

HMAC:是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。所以,HMAC_SHA1也是需要一个密钥的,而SHA1不需要。

其他常用算法:

Base64:其实不是安全领域下的加密解密算法,只能算是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,对数据内容进行编码来适合传输(可以对img图像编码用于传输)。这是一种可逆的编码方式。编码后的数据是一个字符串,其中包含的字符为:A-Za-z0-9+/,共64个字符(26 + 26 + 10 + 1 + 1 = 64,其实是65个字符,=是填充字符。Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。原文的字节最后不够3个的地方用0来补足,转换时Base64编码用=号来代替。这就是为什么有些Base64编码会以一个或两个等号结束的原因,中间是不可能出现等号的,但等号最多只有两个。其实不用"="也不耽误解码,之所以用"=",可能是考虑到多段编码后的Base64字符串拼起来也不会引起混淆。)

Base64编码是从二进制到字符的过程,像一些中文字符用不同的编码转为二进制时,产生的二进制是不一样的,所以最终产生的Base64字符也不一样。例如"上网"对应utf-8格式的Base64编码是"5LiK572R" 对应GB2312格式的Base64编码是"yc/N+A=="

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/+字符变为形如%XX的形式,而这些%号在存入数据库时还需要再进行转换,因为ANSI SQL中已将%号用作通配符。

为解决此问题,可采用一种用于URL的改进Base64编码,它不在末尾填充'='号,并将标准Base64中的+/分别改成了-_,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。

另有一种用于正则表达式的改进Base64变种,它将+/改成了!-,因为+*以及前面在IRCu中用到的[]在正则表达式中都可能具有特殊含义。

此外还有一些变种,它们将+/改为_-._”(用作编程语言中的标识符名称)或.-(用于XML中的Nmtoken)甚至_:(用于XML中的Name)。

​HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL(SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。),因此加密的详细内容就需要SSLhttps:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTPTCP之间),提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

项目应用总结:

1. 加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证。

2. 对称加密算法使用同一个密匙加密和解密,速度快,适合给大量数据加密。对称加密客户端和服务端使用同一个密匙,存在被抓包破解的风险。

3. 非对称加密算法使用公钥加密,私钥解密,私钥签名,公钥验签。安全性比对称加密高,但速度较慢。非对称加密使用两个密匙,服务端和客户端密匙不一样,私钥放在服务端,黑客一般是拿不到的,安全性高。

4. Base64不是安全领域下的加解密算法,只是一个编码算法,通常用于把二进制数据编码为可写的字符形式的数据,特别适合在httpmime协议下的网络快速传输数据。UTF-8GBK中文的Base64编码结果是不同的。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到,但这种方式很初级,很简单。Base64可以对图片文件进行编码传输。

5. https协议广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

6. 大量数据加密建议采用对称加密算法,提高加解密速度;小量的机密数据,可以采用非对称加密算法。在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

7. MD5标准密钥长度128位(128位是指二进制位。二进制太长,所以一般都改写成16进制,每一位16进制数可以代替4位二进制数,所以128位二进制数写成16进制就变成了128/4=32位。16位加密就是从32MD5散列中把中间16位提取出来);sha1标准密钥长度160(MD5摘要长32)Base64转换后的字符串理论上将要比原来的长1/3

AES算法

什么是AES加密算法

AES是高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,目前已经被全世界广泛使用,同时AES已经成为对称密钥加密中最流行的算法之一。AES支持三种长度的密钥:128位,192位,256位。

AES加密需要:明文 + 密钥+ 偏移量(IV)+密码模式(算法/模式/填充)

AES解密需要:密文 + 密钥+ 偏移量(IV)+密码模式(算法/模式/填充)

AES加密模式

AES的加密模式有以下几种

    • 电码本模式(ECB)
    • 密码分组链接模式(CBC)
    • 计算器模式(CTR)
    • 密码反馈模式(CFB)
    • 输出反馈模式(OFB)

密码分组链接模式(CBC):将整段明文切成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

电码本模式 ECB (Electronic codebook,ECB):需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。

SAP AES encrypt_第1张图片

根据图示,在 CBC 模式下,使用 AES 加解密方式进行分组加解密时,需要用到的两个参数

1、初始化向量,也就是偏移量

2、加解密秘钥

AES加密算法原理

1.密钥

密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

AES支持三种长度的密钥:128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

2.填充

要想了解填充的概念,我们先要了解AES的分组加密特性。什么是分组加密呢?我们来看看下面这张图:AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。

这些明文块经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接在一起,就是最终的AES加密结果。

假如一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

填充涉及以下三种填充模式:

SAP AES encrypt_第2张图片

NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。

PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

常见填充模式

算法/模式/填充

16字节加密后数据长度

不满16字节加密后长度

AES/CBC/NoPadding

16

不支持

AES/CBC/PKCS5Padding

32

16

AES/CBC/ISO10126Padding

32

16

AES/CFB/NoPadding

16

原始数据长度

AES/CFB/PKCS5Padding

32

16

AES/CFB/ISO10126Padding

32

16

AES/ECB/NoPadding

16

不支持

AES/ECB/PKCS5Padding

32

16

AES/ECB/ISO10126Padding

32

16

AES/OFB/NoPadding

16

不支持

AES/OFB/PKCS5Padding

32

16

AES/OFB/ISO10126Padding

32

16

AES/PCBC/NoPadding

16

不支持

AES/PCBC/PKCS5Padding

32

16

AES/PCBC/ISO10126Padding

32

16

AES算法流程

AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。下图给出了AES加解密的流程,从图中可以看出:

1、解密算法的每一步分别对应加密算法的逆操作;

2、加解密所有操作的顺序正好是相反的。正是由于这几点(再加上加密算法与解密算法每步的操作互逆)保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。

SAP AES encrypt_第3张图片

AddRoundKey (轮密钥加)— 矩阵中的每一个字节都与该次轮密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

SubBytes(字节替代) — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

ShiftRows(行移位) — 将矩阵中的每个横列进行循环式移位。

MixColumns (列混淆)— 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。

以上为AES在加密中的大致流程。

Code sample:

*&---------------------------------------------------------------------*

*& Report  YYZ_TEST_AES

*&

*&---------------------------------------------------------------------*

*&

*&

*&---------------------------------------------------------------------*

REPORT yyz_test_aes.

DATAlv_output    TYPE string,

      lv_key_xs    TYPE xstring,

      lv_input_xs  TYPE xstring,

      lv_cipertext TYPE xstring,

      lv_result    TYPE string.

SELECTION-SCREEN PUSHBUTTON 1(15pb_key USER-COMMAND gen_key.

PARAMETERSp_en RADIOBUTTON GROUP g1 DEFAULT 'X' USER-COMMAND ucomm1,

            p_de RADIOBUTTON GROUP g1.

PARAMETERSp_input  TYPE string MODIF ID m1 LOWER CASE,

            p_output TYPE string MODIF ID m2 LOWER CASE,

            p_key    TYPE string LOWER CASE.

INITIALIZATION.

  pb_key 'Generate Key'.

AT SELECTION-SCREEN OUTPUT.

  LOOP AT SCREEN.

    CASE abap_true.

      WHEN p_en.

        CASE screen-group1 .

          WHEN 'M1'.

            screen-active 1.

            MODIFY SCREEN.

          WHEN 'M2'.

            screen-active 0.

            MODIFY SCREEN.

          WHEN OTHERS.

        ENDCASE.

      WHEN p_de.

        CASE screen-group1 .

          WHEN 'M1'.

            screen-active 0.

            MODIFY SCREEN.

          WHEN 'M2'.

            screen-active 1.

            MODIFY SCREEN.

          WHEN OTHERS.

        ENDCASE.

      WHEN OTHERS.

    ENDCASE.

  ENDLOOP.

AT SELECTION-SCREEN.

  CASE sy-ucomm.

    WHEN 'GEN_KEY'.

      CALL METHOD cl_sec_sxml_writer=>generate_key

        EXPORTING

          algorithm cl_sec_sxml_writer=>co_aes128_algorithm

        RECEIVING

          key       lv_key_xs.

      p_key lv_key_xs.

    WHEN OTHERS.

  ENDCASE.

START-OF-SELECTION.

  CHECK p_key IS NOT INITIAL.

  lv_key_xs p_key.

  CASE abap_true.

    WHEN p_en.

*      lv_input_xs = cl_abap_codepage=>convert_to( source = lv_input ).

      CALL FUNCTION 'SCMS_STRING_TO_XSTRING'

        EXPORTING

          text   p_input

        IMPORTING

          buffer lv_input_xs

        EXCEPTIONS

          failed 1

          OTHERS 2.

      TRY .

          CALL METHOD cl_sec_sxml_writer=>encrypt

            EXPORTING

              plaintext  lv_input_xs

              key        lv_key_xs

              algorithm  cl_sec_sxml_writer=>co_aes128_algorithm

*              algorithm  = 'http://www.portaldasfinancas.gov.pt/SAFT#aes128-ecb'

            IMPORTING

              ciphertext lv_cipertext.

        CATCH cx_sec_sxml_encrypt_error.

      ENDTRY.

      CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'

        EXPORTING

          input  lv_cipertext

        IMPORTING

          output lv_result.

    WHEN p_de.

      CHECK p_output IS NOT INITIAL.

      CALL FUNCTION 'SCMS_BASE64_DECODE_STR'

        EXPORTING

          input  p_output

*         UNESCAPE       = 'X'

        IMPORTING

          output lv_cipertext

        EXCEPTIONS

          failed 1

          OTHERS 2.

      IF lv_cipertext IS NOT INITIAL AND lv_key_xs IS NOT INITIAL.

        CALL METHOD cl_sec_sxml_writer=>decrypt

          EXPORTING

            ciphertext lv_cipertext

            key        lv_key_xs

*            algorithm  = cl_sec_sxml_writer=>co_aes128_algorithm

           algorithm  'http://www.portaldasfinancas.gov.pt/SAFT#aes128-ecb'

          IMPORTING

            plaintext  lv_input_xs.

*        cl_abap_conv_in_ce=>create( input = lv_input_xs )->read( IMPORTING data = lv_result ).

        lv_result /ui2/cl_abap2json=>conv_xstring_to_stringlv_input_xs ).

      ENDIF.

    WHEN OTHERS.

  ENDCASE.

  WRITElv_result.

你可能感兴趣的:(开发语言,SAP,ABAP)