看到SAP社区中有人问是否存在ABAP实现的Blowfish加密算法,无人回答。于是动手实现了一个blowfish-abap。通过blowfish-abap可以在SAP系统中使用Blowfish对数据进行加密。

什么是Blowfish?

Blowfish是一种对称密钥分组密码算法,它有实现简单、不需要授权、完全免费、密钥长度可变、加密效率高等特点,在某些领域有所应用。关于这几个特点的具体介绍,

  1. 快速。Blowfish在32位微处理器上的加密速度达到每字节26个时钟周期。
  2. 紧凑。Blowfish能在容量小于5K的存储器中运行。
  3. 简单。Blowfish仅使用了一些简单运算:基于32位的加、异或和查表。它的设计容易分析,且可阻止它的错误实现。
  4. 可变的安全性,Blowfish的密钥长度是可变的,且能达到448位。在密钥不需要经常更改的应用中,如通信连接和自动文件加密器,

Blowfish是最优秀的一个算法,当在32位具有大内存的微处理器上实现时,其速度比DES快得多。Blowfish不适合于分组交换、经常更换密钥和单向函数中。它需要大的存储器,使得它不能有效地在智能卡应用中实现。

(参考《应用密码学》第二版,14.3 Blowfish算法)

它是由Bruce Schneier提出的:http://www.schneier.com/paper-blowfish-fse.html

本文链接:https://www.cnblogs.com/hhelibeb/p/11714225.html

原创内容,转载请注明

blowfish-abap

blowfish-abap是blowfish的ABAP语言实现,大约包含1000行代码,它的Github地址如下:https://github.com/hhelibeb/blowfish-abap

如果你在使用当中遇到任何问题,请在本文评论,或在Github提issue。

使用

使用ABAPGIT安装后即可使用,调用代码如下,

  1. DATA(blowfish) = NEW zcl_blowfish( CONV #( '04B915BA43FEB5B6' ) ).
  2.  
  3. DATA(plain) = 'The quick brown fox jumped over the lazy dog.'.
  4. DATA(cipher) = blowfish->encrypt_cbc( CONV #( plain ) ).
  5. plain = blowfish->decrypt_cbc( cipher ).
  6.  
  7. cl_demo_output=>display( plain && cl_abap_char_utilities=>newline && cipher ).

结果,

(密文字符串过长,未完全展示)

测试用例

项目中包含单元测试(zcl_blowfish.clas.testclasses.abap),用例来源于 https://www.schneier.com/code/vectors.txt

源代码

下面是当前的源代码,最新版代码请到Github查看,

  1. CLASS zcl_blowfish DEFINITION
  2. PUBLIC
  3. FINAL
  4. CREATE PUBLIC .
  5.  
  6. PUBLIC SECTION.
  7.  
  8. TYPES: ty_byte_t TYPE STANDARD TABLE OF x WITH EMPTY KEY.
  9.  
  10. DATA: non_standard_method TYPE abap_bool.
  11.  
  12. METHODS: constructor IMPORTING !hexkey TYPE xstring
  13. RAISING cx_me_illegal_argument.
  14.  
  15. METHODS: decrypt_cbc IMPORTING !cipher_text TYPE string
  16. RETURNING VALUE(plain_text) TYPE string.
  17. METHODS: encrypt_cbc IMPORTING !plain_text TYPE string
  18. RETURNING VALUE(cipher_text) TYPE string.
  19. METHODS: decrypt_ecb IMPORTING !cipher_text TYPE string
  20. RETURNING VALUE(plain_text) TYPE string.
  21. METHODS: encrypt_ecb IMPORTING !plain_text TYPE string
  22. RETURNING VALUE(cipher_text) TYPE string.
  23.  
  24. METHODS: set_iv IMPORTING !iv TYPE ty_byte_t
  25. RAISING cx_me_illegal_argument.
  26. METHODS: get_iv RETURNING VALUE(iv) TYPE ty_byte_t.
  27.  
  28. PROTECTED SECTION.
  29. PRIVATE SECTION.
  30.  
  31. TYPES: p1 TYPE p LENGTH DECIMALS .
  32. TYPES: ty_string_t TYPE string_table.
  33. TYPES: ty_sblock_t TYPE xstring_table.
  34.  
  35. CONSTANTS: c_utf8 TYPE abap_encod VALUE 'UTF-8'.
  36.  
  37. DATA: init_vector TYPE ty_byte_t.
  38.  
  39. DATA: bf_s0 TYPE ty_sblock_t.
  40. DATA: bf_s1 TYPE ty_sblock_t.
  41. DATA: bf_s2 TYPE ty_sblock_t.
  42. DATA: bf_s3 TYPE ty_sblock_t.
  43. DATA: bf_p TYPE ty_sblock_t.
  44. DATA: xl_par TYPE xstring.
  45. DATA: xr_par TYPE xstring.
  46.  
  47. DATA: iv_set TYPE abap_bool.
  48.  
  49. METHODS: setup_key IMPORTING cipher_key TYPE ty_byte_t.
  50. METHODS: set_random_iv.
  51.  
  52. METHODS: setup_p RETURNING VALUE(p) TYPE ty_sblock_t.
  53. METHODS: setup_s0 RETURNING VALUE(s0) TYPE ty_sblock_t.
  54. METHODS: setup_s1 RETURNING VALUE(s1) TYPE ty_sblock_t.
  55. METHODS: setup_s2 RETURNING VALUE(s2) TYPE ty_sblock_t.
  56. METHODS: setup_s3 RETURNING VALUE(s3) TYPE ty_sblock_t.
  57.  
  58. METHODS: hex_to_byte IMPORTING !hex TYPE xstring
  59. RETURNING VALUE(byte_tab) TYPE ty_byte_t.
  60.  
  61. METHODS: byte_to_hex IMPORTING !byte_tab TYPE ty_byte_t
  62. RETURNING VALUE(hex) TYPE xstring.
  63.  
  64. METHODS: round1 IMPORTING !a TYPE xstring
  65. !b TYPE xstring
  66. !n TYPE int4
  67. RETURNING VALUE(r) TYPE xstring.
  68.  
  69. METHODS: decipher.
  70. METHODS: encipher.
  71.  
  72. METHODS: get_block CHANGING !block TYPE ty_byte_t.
  73. METHODS: set_block IMPORTING !block TYPE ty_byte_t.
  74.  
  75. METHODS: block_decrypt CHANGING !block TYPE ty_byte_t.
  76. METHODS: block_encrypt CHANGING !block TYPE ty_byte_t.
  77.  
  78. METHODS: xor_block IMPORTING !iv TYPE ty_byte_t
  79. CHANGING !block TYPE ty_byte_t.
  80.  
  81. METHODS: table_reverse CHANGING !itab TYPE STANDARD TABLE.
  82.  
  83. METHODS: table_copy IMPORTING !src TYPE STANDARD TABLE
  84. !src_offset TYPE i
  85. !dst_offset TYPE i
  86. !count TYPE i
  87. CHANGING !dst TYPE STANDARD TABLE.
  88.  
  89. METHODS: word_byte0 IMPORTING !word TYPE xstring
  90. RETURNING VALUE(b) TYPE int4.
  91. METHODS: word_byte1 IMPORTING !word TYPE xstring
  92. RETURNING VALUE(b) TYPE int4.
  93. METHODS: word_byte2 IMPORTING !word TYPE xstring
  94. RETURNING VALUE(b) TYPE int4.
  95. METHODS: word_byte3 IMPORTING !word TYPE xstring
  96. RETURNING VALUE(b) TYPE int4.
  97.  
  98. METHODS: crypt_cbc IMPORTING !text TYPE ty_byte_t
  99. !decrypt TYPE abap_bool
  100. RETURNING VALUE(plain_text) TYPE ty_byte_t.
  101. METHODS: crypt_ecb IMPORTING !text TYPE ty_byte_t
  102. !decrypt TYPE abap_bool
  103. RETURNING VALUE(plain_text) TYPE ty_byte_t.
  104.  
  105. METHODS: to_int4 IMPORTING !xdata TYPE xstring
  106. RETURNING VALUE(int4) TYPE xstring.
  107.  
  108. ENDCLASS.
  109.  
  110. CLASS ZCL_BLOWFISH IMPLEMENTATION.
  111.  
  112. METHOD block_decrypt.
  113.  
  114. set_block( block ).
  115. decipher( ).
  116. get_block( CHANGING block = block ).
  117.  
  118. ENDMETHOD.
  119.  
  120. METHOD block_encrypt.
  121.  
  122. set_block( block ).
  123. encipher( ).
  124. get_block( CHANGING block = block ).
  125.  
  126. ENDMETHOD.
  127.  
  128. METHOD byte_to_hex.
  129.  
  130. LOOP AT byte_tab ASSIGNING FIELD-SYMBOL(<byte>).
  131. hex = hex && <byte>.
  132. ENDLOOP.
  133.  
  134. ENDMETHOD.
  135.  
  136. METHOD constructor.
  137.  
  138. DATA(key_len) = xstrlen( hexkey ).
  139.  
  140. IF key_len = OR key_len > . "448bits.
  141. RAISE EXCEPTION TYPE cx_me_illegal_argument
  142. EXPORTING
  143. name = 'HEXKEY'
  144. value = 'Incorrect key length'.
  145. ENDIF.
  146.  
  147. setup_key( EXPORTING cipher_key = hex_to_byte( hexkey ) ).
  148.  
  149. ENDMETHOD.
  150.  
  151. METHOD crypt_cbc.
  152.  
  153. IF iv_set = abap_false.
  154. RETURN.
  155. ENDIF.
  156.  
  157. table_copy(
  158. EXPORTING
  159. src = text
  160. src_offset =
  161. dst_offset =
  162. count = lines( text )
  163. CHANGING
  164. dst = plain_text
  165. ).
  166.  
  167. DATA: block TYPE ty_byte_t,
  168. preblock TYPE ty_byte_t,
  169. iv TYPE ty_byte_t.
  170.  
  171. table_copy(
  172. EXPORTING
  173. src = init_vector
  174. src_offset =
  175. dst_offset =
  176. count =
  177. CHANGING
  178. dst = iv
  179. ).
  180.  
  181. DATA(plain_length) = lines( plain_text ).
  182.  
  183. DATA(padded_length) = COND int4(
  184. WHEN plain_length MOD = THEN plain_length
  185. ELSE plain_length + - ( plain_length MOD ) ).
  186.  
  187. DATA(copy_index) = .
  188.  
  189. IF decrypt = abap_true.
  190.  
  191. WHILE copy_index <= padded_length.
  192.  
  193. table_copy(
  194. EXPORTING
  195. src = plain_text
  196. src_offset = copy_index
  197. dst_offset =
  198. count =
  199. CHANGING
  200. dst = block
  201. ).
  202.  
  203. table_copy(
  204. EXPORTING
  205. src = block
  206. src_offset =
  207. dst_offset =
  208. count =
  209. CHANGING
  210. dst = preblock
  211. ).
  212.  
  213. block_decrypt( CHANGING block = block ).
  214. xor_block( EXPORTING iv = iv CHANGING block = block ).
  215.  
  216. table_copy(
  217. EXPORTING
  218. src = preblock
  219. src_offset =
  220. dst_offset =
  221. count =
  222. CHANGING
  223. dst = iv
  224. ).
  225.  
  226. table_copy(
  227. EXPORTING
  228. src = block
  229. src_offset =
  230. dst_offset = copy_index
  231. count =
  232. CHANGING
  233. dst = plain_text
  234. ).
  235.  
  236. copy_index = copy_index + .
  237.  
  238. ENDWHILE.
  239.  
  240. ELSE.
  241.  
  242. WHILE copy_index <= padded_length.
  243.  
  244. table_copy(
  245. EXPORTING
  246. src = plain_text
  247. src_offset = copy_index
  248. dst_offset =
  249. count =
  250. CHANGING
  251. dst = block
  252. ).
  253.  
  254. xor_block( EXPORTING iv = iv CHANGING block = block ).
  255. block_encrypt( CHANGING block = block ).
  256.  
  257. table_copy(
  258. EXPORTING
  259. src = block
  260. src_offset =
  261. dst_offset =
  262. count =
  263. CHANGING
  264. dst = iv
  265. ).
  266.  
  267. table_copy(
  268. EXPORTING
  269. src = block
  270. src_offset =
  271. dst_offset = copy_index
  272. count =
  273. CHANGING
  274. dst = plain_text
  275. ).
  276.  
  277. copy_index = copy_index + .
  278.  
  279. ENDWHILE.
  280.  
  281. ENDIF.
  282.  
  283. ENDMETHOD.
  284.  
  285. METHOD crypt_ecb.
  286.  
  287. table_copy(
  288. EXPORTING
  289. src = text
  290. src_offset =
  291. dst_offset =
  292. count = lines( text )
  293. CHANGING
  294. dst = plain_text
  295. ).
  296.  
  297. DATA: block TYPE ty_byte_t.
  298.  
  299. DATA(plain_length) = lines( plain_text ).
  300.  
  301. DATA(padded_length) = COND int4(
  302. WHEN plain_length MOD = THEN plain_length
  303. ELSE plain_length + - ( plain_length MOD ) ).
  304.  
  305. DATA(copy_index) = .
  306.  
  307. WHILE copy_index <= padded_length.
  308.  
  309. table_copy(
  310. EXPORTING
  311. src = plain_text
  312. src_offset = copy_index
  313. dst_offset =
  314. count =
  315. CHANGING
  316. dst = block
  317. ).
  318.  
  319. IF decrypt = abap_true.
  320. block_decrypt( CHANGING block = block ).
  321. ELSE.
  322. block_encrypt( CHANGING block = block ).
  323. ENDIF.
  324. table_copy(
  325. EXPORTING
  326. src = block
  327. src_offset =
  328. dst_offset = copy_index
  329. count =
  330. CHANGING
  331. dst = plain_text
  332. ).
  333.  
  334. copy_index = copy_index + .
  335.  
  336. ENDWHILE.
  337.  
  338. ENDMETHOD.
  339.  
  340. METHOD decipher.
  341.  
  342. DATA(rounds) = .
  343.  
  344. xl_par = xl_par BIT-XOR bf_p[ rounds ].
  345.  
  346. rounds = rounds - .
  347.  
  348. WHILE rounds > .
  349. xr_par = round1( a = xr_par b = xl_par n = rounds ).
  350. xl_par = round1( a = xl_par b = xr_par n = rounds - ).
  351. rounds = rounds - .
  352. ENDWHILE.
  353.  
  354. xr_par = xr_par BIT-XOR bf_p[ rounds ].
  355.  
  356. DATA(swap) = xl_par.
  357. xl_par = xr_par.
  358. xr_par = swap.
  359.  
  360. ENDMETHOD.
  361.  
  362. METHOD decrypt_cbc.
  363.  
  364. IF strlen( cipher_text ) < .
  365. RETURN.
  366. ENDIF.
  367.  
  368. DATA(iv) = cipher_text().
  369. DATA(cipher_text_x) = CONV xstring( cipher_text+ ).
  370.  
  371. set_iv( hex_to_byte( CONV #( iv ) ) ).
  372.  
  373. DATA(string_text) = CONV string( byte_to_hex( crypt_cbc( text = hex_to_byte( cipher_text_x ) decrypt = abap_true ) ) ).
  374.  
  375. REPLACE ALL OCCURRENCES OF || IN string_text WITH ``.
  376.  
  377. DATA(xstring_text) = CONV xstring( string_text ).
  378.  
  379. CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
  380. EXPORTING
  381. im_xstring = xstring_text
  382. im_encoding = c_utf8
  383. IMPORTING
  384. ex_string = plain_text
  385. EXCEPTIONS
  386. other = .
  387.  
  388. ENDMETHOD.
  389.  
  390. METHOD decrypt_ecb.
  391.  
  392. DATA(string_text) = CONV string( byte_to_hex( crypt_ecb( text = hex_to_byte( CONV #( cipher_text ) ) decrypt = abap_true ) ) ).
  393.  
  394. REPLACE ALL OCCURRENCES OF || IN string_text WITH ``.
  395.  
  396. DATA(xstring_text) = CONV xstring( string_text ).
  397.  
  398. CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
  399. EXPORTING
  400. im_xstring = xstring_text
  401. im_encoding = c_utf8
  402. IMPORTING
  403. ex_string = plain_text
  404. EXCEPTIONS
  405. other = .
  406.  
  407. ENDMETHOD.
  408.  
  409. METHOD encipher.
  410.  
  411. DATA(rounds) = .
  412.  
  413. xl_par = xl_par BIT-XOR bf_p[ rounds ].
  414.  
  415. WHILE rounds < .
  416. xr_par = round1( a = xr_par b = xl_par n = rounds + ).
  417. xl_par = round1( a = xl_par b = xr_par n = rounds + ).
  418. rounds = rounds + .
  419. ENDWHILE.
  420.  
  421. xr_par = xr_par BIT-XOR bf_p[ rounds + ].
  422.  
  423. DATA(swap) = xl_par.
  424. xl_par = xr_par.
  425. xr_par = swap.
  426.  
  427. ENDMETHOD.
  428.  
  429. METHOD encrypt_cbc.
  430.  
  431. IF iv_set = abap_false.
  432. set_random_iv( ).
  433. ENDIF.
  434.  
  435. DATA: plaint_text_x TYPE xstring.
  436.  
  437. CALL FUNCTION 'ECATT_CONV_STRING_TO_XSTRING'
  438. EXPORTING
  439. im_string = plain_text
  440. im_encoding = c_utf8
  441. IMPORTING
  442. ex_xstring = plaint_text_x
  443. EXCEPTIONS
  444. other = .
  445.  
  446. DATA(in1) = CONV string( byte_to_hex( init_vector ) ).
  447. DATA(ct1) = CONV string( byte_to_hex( crypt_cbc( text = hex_to_byte( plaint_text_x ) decrypt = abap_false ) ) ).
  448.  
  449. cipher_text = in1 && ct1.
  450.  
  451. ENDMETHOD.
  452.  
  453. METHOD encrypt_ecb.
  454.  
  455. DATA: plaint_text_x TYPE xstring.
  456.  
  457. CALL FUNCTION 'ECATT_CONV_STRING_TO_XSTRING'
  458. EXPORTING
  459. im_string = plain_text
  460. im_encoding = c_utf8
  461. IMPORTING
  462. ex_xstring = plaint_text_x
  463. EXCEPTIONS
  464. other = .
  465.  
  466. cipher_text = byte_to_hex( crypt_ecb( text = hex_to_byte( plaint_text_x ) decrypt = abap_false ) ) .
  467.  
  468. ENDMETHOD.
  469.  
  470. METHOD get_block.
  471.  
  472. DATA:
  473. block1 TYPE ty_byte_t,
  474. block2 TYPE ty_byte_t.
  475.  
  476. IF non_standard_method = abap_true.
  477. block1 = hex_to_byte( xr_par ).
  478. block2 = hex_to_byte( xl_par ).
  479. table_reverse( CHANGING itab = block1 ).
  480. table_reverse( CHANGING itab = block2 ).
  481. ELSE.
  482. block1 = hex_to_byte( xl_par ).
  483. block2 = hex_to_byte( xr_par ).
  484. ENDIF.
  485.  
  486. table_copy(
  487. EXPORTING
  488. src = block1
  489. src_offset =
  490. dst_offset =
  491. count =
  492. CHANGING
  493. dst = block
  494. ).
  495.  
  496. table_copy(
  497. EXPORTING
  498. src = block2
  499. src_offset =
  500. dst_offset =
  501. count =
  502. CHANGING
  503. dst = block
  504. ).
  505.  
  506. ENDMETHOD.
  507.  
  508. METHOD get_iv.
  509. iv = init_vector.
  510. ENDMETHOD.
  511.  
  512. METHOD hex_to_byte.
  513.  
  514. DATA: byte TYPE x.
  515.  
  516. DATA: hex_index TYPE i.
  517.  
  518. DO xstrlen( hex ) TIMES.
  519. byte = hex+hex_index().
  520. INSERT byte INTO TABLE byte_tab.
  521. hex_index = hex_index + .
  522. ENDDO.
  523.  
  524. ENDMETHOD.
  525.  
  526. METHOD round1.
  527.  
  528. DATA: x1 TYPE xstring,
  529. x2 TYPE xstring,
  530. x3 TYPE xstring,
  531. x4 TYPE xstring.
  532.  
  533. x1 = to_int4( CONV #( CONV int8( bf_s0[ word_byte0( b ) + ] + bf_s1[ word_byte1( b ) + ] ) ) ) .
  534. x2 = x1 BIT-XOR bf_s2[ word_byte2( b ) + ].
  535. x3 = to_int4( CONV #( CONV int8( x2 + bf_s3[ word_byte3( b ) + ] ) ) ).
  536. x4 = x3 BIT-XOR bf_p[ n ].
  537.  
  538. r = x4 BIT-XOR a.
  539.  
  540. ENDMETHOD.
  541.  
  542. METHOD setup_key.
  543.  
  544. bf_p = setup_p( ).
  545. bf_s0 = setup_s0( ).
  546. bf_s1 = setup_s1( ).
  547. bf_s2 = setup_s2( ).
  548. bf_s3 = setup_s3( ).
  549.  
  550. DATA: key TYPE ty_byte_t.
  551.  
  552. DATA(key_len) = lines( cipher_key ).
  553.  
  554. key = cipher_key.
  555.  
  556. DATA(j) = .
  557. DATA(p_index) = .
  558.  
  559. DO TIMES.
  560.  
  561. DATA(d) = CONV xstring( ( ( CONV int8( key[ j MOD key_len + ] ) * + key[ ( j + ) MOD key_len + ] ) * + key[ ( j + ) MOD key_len + ] ) * + key[ ( j + ) MOD key_len + ] ).
  562. bf_p[ p_index ] = bf_p[ p_index ] BIT-XOR d.
  563. j = ( j + ) MOD key_len.
  564. p_index = p_index + .
  565.  
  566. ENDDO.
  567.  
  568. xl_par = .
  569. xr_par = .
  570.  
  571. p_index = .
  572. WHILE p_index < .
  573. encipher( ).
  574. bf_p[ p_index ] = xl_par.
  575. bf_p[ p_index + ] = xr_par.
  576. p_index = p_index + .
  577. ENDWHILE.
  578.  
  579. p_index = .
  580. WHILE p_index < .
  581. encipher( ).
  582. bf_s0[ p_index ] = xl_par.
  583. bf_s0[ p_index + ] = xr_par.
  584. p_index = p_index + .
  585. ENDWHILE.
  586.  
  587. p_index = .
  588. WHILE p_index < .
  589. encipher( ).
  590. bf_s1[ p_index ] = xl_par.
  591. bf_s1[ p_index + ] = xr_par.
  592. p_index = p_index + .
  593. ENDWHILE.
  594.  
  595. p_index = .
  596. WHILE p_index < .
  597. encipher( ).
  598. bf_s2[ p_index ] = xl_par.
  599. bf_s2[ p_index + ] = xr_par.
  600. p_index = p_index + .
  601. ENDWHILE.
  602.  
  603. p_index = .
  604. WHILE p_index < .
  605. encipher( ).
  606. bf_s3[ p_index ] = xl_par.
  607. bf_s3[ p_index + ] = xr_par.
  608. p_index = p_index + .
  609. ENDWHILE.
  610.  
  611. ENDMETHOD.
  612.  
  613. METHOD setup_p.
  614.  
  615. p = VALUE #(
  616. ( |243F6A88| ) ( |85A308D3| ) ( |13198A2E| ) ( || )
  617. ( |A4093822| ) ( |299F31D0| ) ( |082EFA98| ) ( |EC4E6C89| )
  618. ( |452821E6| ) ( |38D01377| ) ( |BE5466CF| ) ( |34E90C6C| )
  619. ( |C0AC29B7| ) ( |C97C50DD| ) ( |3F84D5B5| ) ( |B5470917| )
  620. ( |9216D5D9| ) ( |8979FB1B| )
  621. ).
  622.  
  623. ENDMETHOD.
  624.  
  625. METHOD setup_s0.
  626.  
  627. s0 = VALUE ty_string_t(
  628. ( |D1310BA6| ) ( |98DFB5AC| ) ( |2FFD72DB| ) ( |D01ADFB7| ) ( |B8E1AFED| ) ( |6A267E96| )
  629. ( |BA7C9045| ) ( |F12C7F99| ) ( |24A19947| ) ( |B3916CF7| ) ( |0801F2E2| ) ( |858EFC16| )
  630. ( |636920D8| ) ( |71574E69| ) ( |A458FEA3| ) ( |F4933D7E| ) ( |0D95748F| ) ( |728EB658| )
  631. ( |718BCD58| ) ( |82154AEE| ) ( |7B54A41D| ) ( |C25A59B5| ) ( |9C30D539| ) ( |2AF26013| )
  632. ( |C5D1B023| ) ( |286085F0| ) ( |CA417918| ) ( |B8DB38EF| ) ( |8E79DCB0| ) ( |603A180E| )
  633. ( |6C9E0E8B| ) ( |B01E8A3E| ) ( |D71577C1| ) ( |BD314B27| ) ( |78AF2FDA| ) ( |55605C60| )
  634. ( |E65525F3| ) ( |AA55AB94| ) ( || ) ( |63E81440| ) ( |55CA396A| ) ( |2AAB10B6| )
  635. ( |B4CC5C34| ) ( |1141E8CE| ) ( |A15486AF| ) ( |7C72E993| ) ( |B3EE1411| ) ( |636FBC2A| )
  636. ( |2BA9C55D| ) ( |741831F6| ) ( |CE5C3E16| ) ( |9B87931E| ) ( |AFD6BA33| ) ( |6C24CF5C| )
  637. ( |7A325381| ) ( || ) ( |3B8F4898| ) ( |6B4BB9AF| ) ( |C4BFE81B| ) ( || )
  638. ( |61D809CC| ) ( |FB21A991| ) ( |487CAC60| ) ( |5DEC8032| ) ( |EF845D5D| ) ( |E98575B1| )
  639. ( |DC262302| ) ( |EB651B88| ) ( |23893E81| ) ( |D396ACC5| ) ( |0F6D6FF3| ) ( |83F44239| )
  640. ( |2E0B4482| ) ( |A4842004| ) ( |69C8F04A| ) ( |9E1F9B5E| ) ( |21C66842| ) ( |F6E96C9A| )
  641. ( |670C9C61| ) ( |ABD388F0| ) ( |6A51A0D2| ) ( |D8542F68| ) ( |960FA728| ) ( |AB5133A3| )
  642. ( |6EEF0B6C| ) ( |137A3BE4| ) ( |BA3BF050| ) ( |7EFB2A98| ) ( |A1F1651D| ) ( |39AF0176| )
  643. ( |66CA593E| ) ( |82430E88| ) ( |8CEE8619| ) ( |456F9FB4| ) ( |7D84A5C3| ) ( |3B8B5EBE| )
  644. ( |E06F75D8| ) ( |85C12073| ) ( |401A449F| ) ( |56C16AA6| ) ( |4ED3AA62| ) ( |363F7706| )
  645. ( |1BFEDF72| ) ( |429B023D| ) ( |37D0D724| ) ( |D00A1248| ) ( |DB0FEAD3| ) ( |49F1C09B| )
  646. ( |075372C9| ) ( |80991B7B| ) ( |25D479D8| ) ( |F6E8DEF7| ) ( |E3FE501A| ) ( |B6794C3B| )
  647. ( |976CE0BD| ) ( |04C006BA| ) ( |C1A94FB6| ) ( |409F60C4| ) ( |5E5C9EC2| ) ( |196A2463| )
  648. ( |68FB6FAF| ) ( |3E6C53B5| ) ( |1339B2EB| ) ( |3B52EC6F| ) ( |6DFC511F| ) ( |9B30952C| )
  649. ( |CC814544| ) ( |AF5EBD09| ) ( |BEE3D004| ) ( |DE334AFD| ) ( |660F2807| ) ( |192E4BB3| )
  650. ( |C0CBA857| ) ( |45C8740F| ) ( |D20B5F39| ) ( |B9D3FBDB| ) ( |5579C0BD| ) ( |1A60320A| )
  651. ( |D6A100C6| ) ( |402C7279| ) ( |679F25FE| ) ( |FB1FA3CC| ) ( |8EA5E9F8| ) ( |DB3222F8| )
  652. ( |3C7516DF| ) ( |FD616B15| ) ( |2F501EC8| ) ( |AD0552AB| ) ( |323DB5FA| ) ( |FD238760| )
  653. ( |53317B48| ) ( |3E00DF82| ) ( |9E5C57BB| ) ( |CA6F8CA0| ) ( |1A87562E| ) ( |DF1769DB| )
  654. ( |D542A8F6| ) ( |287EFFC3| ) ( |AC6732C6| ) ( |8C4F5573| ) ( |695B27B0| ) ( |BBCA58C8| )
  655. ( |E1FFA35D| ) ( |B8F011A0| ) ( |10FA3D98| ) ( |FD2183B8| ) ( |4AFCB56C| ) ( |2DD1D35B| )
  656. ( |9A53E479| ) ( |B6F84565| ) ( |D28E49BC| ) ( |4BFB9790| ) ( |E1DDF2DA| ) ( |A4CB7E33| )
  657. ( |62FB1341| ) ( |CEE4C6E8| ) ( |EF20CADA| ) ( |36774C01| ) ( |D07E9EFE| ) ( |2BF11FB4| )
  658. ( |95DBDA4D| ) ( |AE909198| ) ( |EAAD8E71| ) ( |6B93D5A0| ) ( |D08ED1D0| ) ( |AFC725E0| )
  659. ( |8E3C5B2F| ) ( |8E7594B7| ) ( |8FF6E2FB| ) ( |F2122B64| ) ( |8888B812| ) ( |900DF01C| )
  660. ( |4FAD5EA0| ) ( |688FC31C| ) ( |D1CFF191| ) ( |B3A8C1AD| ) ( |2F2F2218| ) ( |BE0E1777| )
  661. ( |EA752DFE| ) ( |8B021FA1| ) ( |E5A0CC0F| ) ( |B56F74E8| ) ( |18ACF3D6| ) ( |CE89E299| )
  662. ( |B4A84FE0| ) ( |FD13E0B7| ) ( |7CC43B81| ) ( |D2ADA8D9| ) ( |165FA266| ) ( || )
  663. ( |93CC7314| ) ( |211A1477| ) ( |E6AD2065| ) ( |77B5FA86| ) ( |C75442F5| ) ( |FB9D35CF| )
  664. ( |EBCDAF0C| ) ( |7B3E89A0| ) ( |D6411BD3| ) ( |AE1E7E49| ) ( |00250E2D| ) ( |2071B35E| )
  665. ( |226800BB| ) ( |57B8E0AF| ) ( |2464369B| ) ( |F009B91E| ) ( |5563911D| ) ( |59DFA6AA| )
  666. ( |78C14389| ) ( |D95A537F| ) ( |207D5BA2| ) ( |02E5B9C5| ) ( || ) ( |6295CFA9| )
  667. ( |11C81968| ) ( |4E734A41| ) ( |B3472DCA| ) ( |7B14A94A| ) ( |1B510052| ) ( |9A532915| )
  668. ( |D60F573F| ) ( |BC9BC6E4| ) ( |2B60A476| ) ( |81E67400| ) ( |08BA6FB5| ) ( |571BE91F| )
  669. ( |F296EC6B| ) ( |2A0DD915| ) ( |B6636521| ) ( |E7B9F9B6| ) ( |FF34052E| ) ( |C5855664| )
  670. ( |53B02D5D| ) ( |A99F8FA1| ) ( |08BA4799| ) ( |6E85076A| )
  671. ).
  672.  
  673. ENDMETHOD.
  674.  
  675. METHOD setup_s1.
  676. s1 = VALUE #(
  677. ( |4B7A70E9| ) ( |B5B32944| ) ( |DB75092E| ) ( |C4192623| ) ( |AD6EA6B0| ) ( |49A7DF7D| )
  678. ( |9CEE60B8| ) ( |8FEDB266| ) ( |ECAA8C71| ) ( |699A17FF| ) ( |5664526C| ) ( |C2B19EE1| )
  679. ( |193602A5| ) ( |75094C29| ) ( |A0591340| ) ( |E4183A3E| ) ( |3F54989A| ) ( |5B429D65| )
  680. ( |6B8FE4D6| ) ( |99F73FD6| ) ( |A1D29C07| ) ( |EFE830F5| ) ( |4D2D38E6| ) ( |F0255DC1| )
  681. ( |4CDD2086| ) ( |8470EB26| ) ( |6382E9C6| ) ( |021ECC5E| ) ( |09686B3F| ) ( |3EBAEFC9| )
  682. ( |3C971814| ) ( |6B6A70A1| ) ( |687F3584| ) ( |52A0E286| ) ( |B79C5305| ) ( |AA500737| )
  683. ( |3E07841C| ) ( |7FDEAE5C| ) ( |8E7D44EC| ) ( |5716F2B8| ) ( |B03ADA37| ) ( |F0500C0D| )
  684. ( |F01C1F04| ) ( |0200B3FF| ) ( |AE0CF51A| ) ( |3CB574B2| ) ( |25837A58| ) ( |DC0921BD| )
  685. ( |D19113F9| ) ( |7CA92FF6| ) ( || ) ( |22F54701| ) ( |3AE5E581| ) ( |37C2DADC| )
  686. ( |C8B57634| ) ( |9AF3DDA7| ) ( |A9446146| ) ( |0FD0030E| ) ( |ECC8C73E| ) ( |A4751E41| )
  687. ( |E238CD99| ) ( |3BEA0E2F| ) ( |3280BBA1| ) ( |183EB331| ) ( |4E548B38| ) ( |4F6DB908| )
  688. ( |6F420D03| ) ( |F60A04BF| ) ( |2CB81290| ) ( |24977C79| ) ( |5679B072| ) ( |BCAF89AF| )
  689. ( |DE9A771F| ) ( |D9930810| ) ( |B38BAE12| ) ( |DCCF3F2E| ) ( |5512721F| ) ( |2E6B7124| )
  690. ( |501ADDE6| ) ( |9F84CD87| ) ( |7A584718| ) ( |7408DA17| ) ( |BC9F9ABC| ) ( |E94B7D8C| )
  691. ( |EC7AEC3A| ) ( |DB851DFA| ) ( || ) ( |C464C3D2| ) ( |EF1C1847| ) ( |3215D908| )
  692. ( |DD433B37| ) ( |24C2BA16| ) ( |12A14D43| ) ( |2A65C451| ) ( || ) ( |133AE4DD| )
  693. ( |71DFF89E| ) ( |10314E55| ) ( |81AC77D6| ) ( |5F11199B| ) ( |043556F1| ) ( |D7A3C76B| )
  694. ( |3C11183B| ) ( |5924A509| ) ( |F28FE6ED| ) ( |97F1FBFA| ) ( |9EBABF2C| ) ( |1E153C6E| )
  695. ( |86E34570| ) ( |EAE96FB1| ) ( |860E5E0A| ) ( |5A3E2AB3| ) ( |771FE71C| ) ( |4E3D06FA| )
  696. ( |2965DCB9| ) ( |99E71D0F| ) ( |803E89D6| ) ( |5266C825| ) ( |2E4CC978| ) ( |9C10B36A| )
  697. ( |C6150EBA| ) ( |94E2EA78| ) ( |A5FC3C53| ) ( |1E0A2DF4| ) ( |F2F74EA7| ) ( |361D2B3D| )
  698. ( |1939260F| ) ( |19C27960| ) ( |5223A708| ) ( |F71312B6| ) ( |EBADFE6E| ) ( |EAC31F66| )
  699. ( |E3BC4595| ) ( |A67BC883| ) ( |B17F37D1| ) ( |018CFF28| ) ( |C332DDEF| ) ( |BE6C5AA5| )
  700. ( || ) ( |68AB9802| ) ( |EECEA50F| ) ( |DB2F953B| ) ( |2AEF7DAD| ) ( |5B6E2F84| )
  701. ( |1521B628| ) ( || ) ( |ECDD4775| ) ( |619F1510| ) ( |13CCA830| ) ( |EB61BD96| )
  702. ( |0334FE1E| ) ( |AA0363CF| ) ( |B5735C90| ) ( |4C70A239| ) ( |D59E9E0B| ) ( |CBAADE14| )
  703. ( |EECC86BC| ) ( |60622CA7| ) ( |9CAB5CAB| ) ( |B2F3846E| ) ( |648B1EAF| ) ( |19BDF0CA| )
  704. ( |A02369B9| ) ( |655ABB50| ) ( |40685A32| ) ( |3C2AB4B3| ) ( |319EE9D5| ) ( |C021B8F7| )
  705. ( |9B540B19| ) ( |875FA099| ) ( |95F7997E| ) ( |623D7DA8| ) ( |F837889A| ) ( |97E32D77| )
  706. ( |11ED935F| ) ( || ) ( |0E358829| ) ( |C7E61FD6| ) ( |96DEDFA1| ) ( |7858BA99| )
  707. ( |57F584A5| ) ( |1B227263| ) ( |9B83C3FF| ) ( |1AC24696| ) ( |CDB30AEB| ) ( |532E3054| )
  708. ( |8FD948E4| ) ( |6DBC3128| ) ( |58EBF2EF| ) ( |34C6FFEA| ) ( |FE28ED61| ) ( |EE7C3C73| )
  709. ( |5D4A14D9| ) ( |E864B7E3| ) ( |42105D14| ) ( |203E13E0| ) ( |45EEE2B6| ) ( |A3AAABEA| )
  710. ( |DB6C4F15| ) ( |FACB4FD0| ) ( |C742F442| ) ( |EF6ABBB5| ) ( |654F3B1D| ) ( |41CD2105| )
  711. ( |D81E799E| ) ( |86854DC7| ) ( |E44B476A| ) ( |3D816250| ) ( |CF62A1F2| ) ( |5B8D2646| )
  712. ( |FC8883A0| ) ( |C1C7B6A3| ) ( |7F1524C3| ) ( |69CB7492| ) ( |47848A0B| ) ( |5692B285| )
  713. ( |095BBF00| ) ( |AD19489D| ) ( |1462B174| ) ( |23820E00| ) ( |58428D2A| ) ( |0C55F5EA| )
  714. ( |1DADF43E| ) ( |233F7061| ) ( |3372F092| ) ( |8D937E41| ) ( |D65FECF1| ) ( |6C223BDB| )
  715. ( |7CDE3759| ) ( |CBEE7460| ) ( |4085F2A7| ) ( |CE77326E| ) ( |A6078084| ) ( |19F8509E| )
  716. ( |E8EFD855| ) ( |61D99735| ) ( |A969A7AA| ) ( |C50C06C2| ) ( |5A04ABFC| ) ( |800BCADC| )
  717. ( |9E447A2E| ) ( |C3453484| ) ( |FDD56705| ) ( |0E1E9EC9| ) ( |DB73DBD3| ) ( |105588CD| )
  718. ( |675FDA79| ) ( |E3674340| ) ( |C5C43465| ) ( |713E38D8| ) ( |3D28F89E| ) ( |F16DFF20| )
  719. ( |153E21E7| ) ( |8FB03D4A| ) ( |E6E39F2B| ) ( |DB83ADF7| )
  720. ).
  721.  
  722. ENDMETHOD.
  723.  
  724. METHOD setup_s2.
  725. s2 = VALUE #(
  726. ( |E93D5A68| ) ( |948140F7| ) ( |F64C261C| ) ( || ) ( |411520F7| ) ( |7602D4F7| )
  727. ( |BCF46B2E| ) ( |D4A20068| ) ( |D4082471| ) ( |3320F46A| ) ( |43B7D4B7| ) ( |500061AF| )
  728. ( |1E39F62E| ) ( || ) ( |14214F74| ) ( |BF8B8840| ) ( |4D95FC1D| ) ( |96B591AF| )
  729. ( |70F4DDD3| ) ( |66A02F45| ) ( |BFBC09EC| ) ( |03BD9785| ) ( |7FAC6DD0| ) ( |31CB8504| )
  730. ( |96EB27B3| ) ( |55FD3941| ) ( |DA2547E6| ) ( |ABCA0A9A| ) ( || ) ( |530429F4| )
  731. ( |0A2C86DA| ) ( |E9B66DFB| ) ( |68DC1462| ) ( |D7486900| ) ( |680EC0A4| ) ( |27A18DEE| )
  732. ( |4F3FFEA2| ) ( |E887AD8C| ) ( |B58CE006| ) ( |7AF4D6B6| ) ( |AACE1E7C| ) ( |D3375FEC| )
  733. ( |CE78A399| ) ( |406B2A42| ) ( |20FE9E35| ) ( |D9F385B9| ) ( |EE39D7AB| ) ( |3B124E8B| )
  734. ( |1DC9FAF7| ) ( |4B6D1856| ) ( |26A36631| ) ( |EAE397B2| ) ( |3A6EFA74| ) ( |DD5B4332| )
  735. ( |6841E7F7| ) ( |CA7820FB| ) ( |FB0AF54E| ) ( |D8FEB397| ) ( |454056AC| ) ( |BA489527| )
  736. ( |55533A3A| ) ( |20838D87| ) ( |FE6BA9B7| ) ( |D096954B| ) ( |55A867BC| ) ( |A1159A58| )
  737. ( |CCA92963| ) ( |99E1DB33| ) ( |A62A4A56| ) ( |3F3125F9| ) ( |5EF47E1C| ) ( |9029317C| )
  738. ( |FDF8E802| ) ( |04272F70| ) ( |80BB155C| ) ( |05282CE3| ) ( |95C11548| ) ( |E4C66D22| )
  739. ( |48C1133F| ) ( |C70F86DC| ) ( |07F9C9EE| ) ( |41041F0F| ) ( |404779A4| ) ( |5D886E17| )
  740. ( |325F51EB| ) ( |D59BC0D1| ) ( |F2BCC18F| ) ( || ) ( |257B7834| ) ( |602A9C60| )
  741. ( |DFF8E8A3| ) ( |1F636C1B| ) ( |0E12B4C2| ) ( |02E1329E| ) ( |AF664FD1| ) ( |CAD18115| )
  742. ( |6B2395E0| ) ( |333E92E1| ) ( |3B240B62| ) ( |EEBEB922| ) ( |85B2A20E| ) ( |E6BA0D99| )
  743. ( |DE720C8C| ) ( |2DA2F728| ) ( |D0127845| ) ( |95B794FD| ) ( |647D0862| ) ( |E7CCF5F0| )
  744. ( |5449A36F| ) ( |877D48FA| ) ( |C39DFD27| ) ( |F33E8D1E| ) ( |0A476341| ) ( |992EFF74| )
  745. ( |3A6F6EAB| ) ( |F4F8FD37| ) ( |A812DC60| ) ( |A1EBDDF8| ) ( |991BE14C| ) ( |DB6E6B0D| )
  746. ( |C67B5510| ) ( |6D672C37| ) ( |2765D43B| ) ( |DCD0E804| ) ( |F1290DC7| ) ( |CC00FFA3| )
  747. ( |B5390F92| ) ( |690FED0B| ) ( |667B9FFB| ) ( |CEDB7D9C| ) ( |A091CF0B| ) ( |D9155EA3| )
  748. ( |BB132F88| ) ( |515BAD24| ) ( |7B9479BF| ) ( |763BD6EB| ) ( |37392EB3| ) ( |CC115979| )
  749. ( |8026E297| ) ( |F42E312D| ) ( |6842ADA7| ) ( |C66A2B3B| ) ( |12754CCC| ) ( |782EF11C| )
  750. ( |6A124237| ) ( |B79251E7| ) ( |06A1BBE6| ) ( |4BFB6350| ) ( |1A6B1018| ) ( |11CAEDFA| )
  751. ( |3D25BDD8| ) ( |E2E1C3C9| ) ( || ) ( |0A121386| ) ( |D90CEC6E| ) ( |D5ABEA2A| )
  752. ( |64AF674E| ) ( |DA86A85F| ) ( |BEBFE988| ) ( |64E4C3FE| ) ( |9DBC8057| ) ( |F0F7C086| )
  753. ( |60787BF8| ) ( |6003604D| ) ( |D1FD8346| ) ( |F6381FB0| ) ( |7745AE04| ) ( |D736FCCC| )
  754. ( |83426B33| ) ( |F01EAB71| ) ( |B0804187| ) ( |3C005E5F| ) ( |77A057BE| ) ( |BDE8AE24| )
  755. ( || ) ( |BF582E61| ) ( |4E58F48F| ) ( |F2DDFDA2| ) ( |F474EF38| ) ( |8789BDC2| )
  756. ( |5366F9C3| ) ( |C8B38E74| ) ( |B475F255| ) ( |46FCD9B9| ) ( |7AEB2661| ) ( |8B1DDF84| )
  757. ( |846A0E79| ) ( |915F95E2| ) ( |466E598E| ) ( |20B45770| ) ( |8CD55591| ) ( |C902DE4C| )
  758. ( |B90BACE1| ) ( |BB8205D0| ) ( |11A86248| ) ( |7574A99E| ) ( |B77F19B6| ) ( |E0A9DC09| )
  759. ( |662D09A1| ) ( |C4324633| ) ( |E85A1F02| ) ( |09F0BE8C| ) ( |4A99A025| ) ( |1D6EFE10| )
  760. ( |1AB93D1D| ) ( |0BA5A4DF| ) ( |A186F20F| ) ( |2868F169| ) ( |DCB7DA83| ) ( |573906FE| )
  761. ( |A1E2CE9B| ) ( |4FCD7F52| ) ( |50115E01| ) ( |A70683FA| ) ( |A002B5C4| ) ( |0DE6D027| )
  762. ( |9AF88C27| ) ( |773F8641| ) ( |C3604C06| ) ( |61A806B5| ) ( |F0177A28| ) ( |C0F586E0| )
  763. ( |006058AA| ) ( |30DC7D62| ) ( |11E69ED7| ) ( |2338EA63| ) ( |53C2DD94| ) ( |C2C21634| )
  764. ( |BBCBEE56| ) ( |90BCB6DE| ) ( |EBFC7DA1| ) ( |CE591D76| ) ( |6F05E409| ) ( |4B7C0188| )
  765. ( |39720A3D| ) ( |7C927C24| ) ( |86E3725F| ) ( |724D9DB9| ) ( |1AC15BB4| ) ( |D39EB8FC| )
  766. ( |ED545578| ) ( |08FCA5B5| ) ( |D83D7CD3| ) ( |4DAD0FC4| ) ( |1E50EF5E| ) ( |B161E6F8| )
  767. ( |A28514D9| ) ( |6C51133C| ) ( |6FD5C7E7| ) ( |56E14EC4| ) ( |362ABFCE| ) ( |DDC6C837| )
  768. ( |D79A3234| ) ( || ) ( |670EFA8E| ) ( |406000E0| )
  769. ).
  770. ENDMETHOD.
  771.  
  772. METHOD setup_s3.
  773.  
  774. s3 = VALUE #(
  775. ( |3A39CE37| ) ( |D3FAF5CF| ) ( |ABC27737| ) ( |5AC52D1B| ) ( |5CB0679E| ) ( |4FA33742| )
  776. ( |D3822740| ) ( |99BC9BBE| ) ( |D5118E9D| ) ( |BF0F7315| ) ( |D62D1C7E| ) ( |C700C47B| )
  777. ( |B78C1B6B| ) ( |21A19045| ) ( |B26EB1BE| ) ( |6A366EB4| ) ( |5748AB2F| ) ( |BC946E79| )
  778. ( |C6A376D2| ) ( |6549C2C8| ) ( |530FF8EE| ) ( |468DDE7D| ) ( |D5730A1D| ) ( |4CD04DC6| )
  779. ( |2939BBDB| ) ( |A9BA4650| ) ( |AC9526E8| ) ( |BE5EE304| ) ( |A1FAD5F0| ) ( |6A2D519A| )
  780. ( |63EF8CE2| ) ( |9A86EE22| ) ( |C089C2B8| ) ( |43242EF6| ) ( |A51E03AA| ) ( |9CF2D0A4| )
  781. ( |83C061BA| ) ( |9BE96A4D| ) ( |8FE51550| ) ( |BA645BD6| ) ( |2826A2F9| ) ( |A73A3AE1| )
  782. ( |4BA99586| ) ( |EF5562E9| ) ( |C72FEFD3| ) ( |F752F7DA| ) ( |3F046F69| ) ( |77FA0A59| )
  783. ( |80E4A915| ) ( |87B08601| ) ( |9B09E6AD| ) ( |3B3EE593| ) ( |E990FD5A| ) ( |9E34D797| )
  784. ( |2CF0B7D9| ) ( |022B8B51| ) ( |96D5AC3A| ) ( |017DA67D| ) ( |D1CF3ED6| ) ( |7C7D2D28| )
  785. ( |1F9F25CF| ) ( |ADF2B89B| ) ( |5AD6B472| ) ( |5A88F54C| ) ( |E029AC71| ) ( |E019A5E6| )
  786. ( |47B0ACFD| ) ( |ED93FA9B| ) ( |E8D3C48D| ) ( |283B57CC| ) ( |F8D56629| ) ( |79132E28| )
  787. ( |785F0191| ) ( |ED756055| ) ( |F7960E44| ) ( |E3D35E8C| ) ( |15056DD4| ) ( |88F46DBA| )
  788. ( |03A16125| ) ( |0564F0BD| ) ( |C3EB9E15| ) ( |3C9057A2| ) ( |97271AEC| ) ( |A93A072A| )
  789. ( |1B3F6D9B| ) ( |1E6321F5| ) ( |F59C66FB| ) ( |26DCF319| ) ( |7533D928| ) ( |B155FDF5| )
  790. ( || ) ( |8ABA3CBB| ) ( || ) ( |C20AD9F8| ) ( |ABCC5167| ) ( |CCAD925F| )
  791. ( |4DE81751| ) ( |3830DC8E| ) ( |379D5862| ) ( |9320F991| ) ( |EA7A90C2| ) ( |FB3E7BCE| )
  792. ( |5121CE64| ) ( |774FBE32| ) ( |A8B6E37E| ) ( |C3293D46| ) ( |48DE5369| ) ( |6413E680| )
  793. ( |A2AE0810| ) ( |DD6DB224| ) ( |69852DFD| ) ( || ) ( |B39A460A| ) ( |6445C0DD| )
  794. ( |586CDECF| ) ( |1C20C8AE| ) ( |5BBEF7DD| ) ( |1B588D40| ) ( |CCD2017F| ) ( |6BB4E3BB| )
  795. ( |DDA26A7E| ) ( |3A59FF45| ) ( |3E350A44| ) ( |BCB4CDD5| ) ( |72EACEA8| ) ( |FA6484BB| )
  796. ( |8D6612AE| ) ( |BF3C6F47| ) ( |D29BE463| ) ( |542F5D9E| ) ( |AEC2771B| ) ( |F64E6370| )
  797. ( |740E0D8D| ) ( |E75B1357| ) ( |F8721671| ) ( |AF537D5D| ) ( |4040CB08| ) ( |4EB4E2CC| )
  798. ( |34D2466A| ) ( |0115AF84| ) ( |E1B00428| ) ( |95983A1D| ) ( |06B89FB4| ) ( |CE6EA048| )
  799. ( |6F3F3B82| ) ( |3520AB82| ) ( |011A1D4B| ) ( |277227F8| ) ( |611560B1| ) ( |E7933FDC| )
  800. ( |BB3A792B| ) ( |344525BD| ) ( |A08839E1| ) ( |51CE794B| ) ( |2F32C9B7| ) ( |A01FBAC9| )
  801. ( |E01CC87E| ) ( |BCC7D1F6| ) ( |CF0111C3| ) ( |A1E8AAC7| ) ( |1A908749| ) ( |D44FBD9A| )
  802. ( |D0DADECB| ) ( |D50ADA38| ) ( |0339C32A| ) ( |C6913667| ) ( |8DF9317C| ) ( |E0B12B4F| )
  803. ( |F79E59B7| ) ( |43F5BB3A| ) ( |F2D519FF| ) ( |27D9459C| ) ( |BF97222C| ) ( |15E6FC2A| )
  804. ( |0F91FC71| ) ( |9B941525| ) ( |FAE59361| ) ( |CEB69CEB| ) ( |C2A86459| ) ( |12BAA8D1| )
  805. ( |B6C1075E| ) ( |E3056A0C| ) ( |10D25065| ) ( |CB03A442| ) ( |E0EC6E0E| ) ( |1698DB3B| )
  806. ( |4C98A0BE| ) ( |3278E964| ) ( |9F1F9532| ) ( |E0D392DF| ) ( |D3A0342B| ) ( |8971F21E| )
  807. ( |1B0A7441| ) ( |4BA3348C| ) ( |C5BE7120| ) ( |C37632D8| ) ( |DF359F8D| ) ( |9B992F2E| )
  808. ( |E60B6F47| ) ( |0FE3F11D| ) ( |E54CDA54| ) ( |1EDAD891| ) ( |CE6279CF| ) ( |CD3E7E6F| )
  809. ( |1618B166| ) ( |FD2C1D05| ) ( |848FD2C5| ) ( |F6FB2299| ) ( |F523F357| ) ( |A6327623| )
  810. ( |93A83531| ) ( |56CCCD02| ) ( |ACF08162| ) ( |5A75EBB5| ) ( |6E163697| ) ( |88D273CC| )
  811. ( |DE966292| ) ( |81B949D0| ) ( |4C50901B| ) ( |71C65614| ) ( |E6C6C7BD| ) ( |327A140A| )
  812. ( |45E1D006| ) ( |C3F27B9A| ) ( |C9AA53FD| ) ( |62A80F00| ) ( |BB25BFE2| ) ( |35BDD2F6| )
  813. ( || ) ( |B2040222| ) ( |B6CBCF7C| ) ( |CD769C2B| ) ( |53113EC0| ) ( |1640E3D3| )
  814. ( |38ABBD60| ) ( |2547ADF0| ) ( |BA38209C| ) ( |F746CE76| ) ( |77AFA1C5| ) ( || )
  815. ( |85CBFE4E| ) ( |8AE88DD8| ) ( |7AAAF9B0| ) ( |4CF9AA7E| ) ( |1948C25C| ) ( |02FB8A8C| )
  816. ( |01C36AE4| ) ( |D6EBE1F9| ) ( |90D4F869| ) ( |A65CDEA0| ) ( |3F09252D| ) ( |C208E69F| )
  817. ( |B74E6132| ) ( |CE77E25B| ) ( |578FDFE3| ) ( |3AC372E6| )
  818. ).
  819.  
  820. ENDMETHOD.
  821.  
  822. METHOD set_block.
  823.  
  824. DATA: block_temp TYPE ty_byte_t,
  825. block1 TYPE ty_byte_t,
  826. block2 TYPE ty_byte_t.
  827.  
  828. table_copy(
  829. EXPORTING
  830. src = block
  831. src_offset =
  832. dst_offset =
  833. count =
  834. CHANGING
  835. dst = block1
  836. ).
  837.  
  838. table_copy(
  839. EXPORTING
  840. src = block
  841. src_offset =
  842. dst_offset =
  843. count =
  844. CHANGING
  845. dst = block2
  846. ).
  847.  
  848. IF non_standard_method = abap_true.
  849. table_reverse( CHANGING itab = block1 ).
  850. table_reverse( CHANGING itab = block2 ).
  851. xr_par = byte_to_hex( block1 ).
  852. xl_par = byte_to_hex( block2 ).
  853. ELSE.
  854. xl_par = byte_to_hex( block1 ).
  855. xr_par = byte_to_hex( block2 ).
  856. ENDIF.
  857.  
  858. ENDMETHOD.
  859.  
  860. METHOD set_iv.
  861. IF lines( iv ) <> .
  862. RAISE EXCEPTION TYPE cx_me_illegal_argument
  863. EXPORTING
  864. name = 'IV'
  865. value = 'Incorrect IV length'.
  866. ENDIF.
  867. init_vector = iv.
  868. iv_set = abap_true.
  869. ENDMETHOD.
  870.  
  871. METHOD set_random_iv.
  872.  
  873. DATA: random TYPE xstring.
  874.  
  875. CALL FUNCTION 'GENERATE_SEC_RANDOM'
  876. EXPORTING
  877. length =
  878. IMPORTING
  879. random = random
  880. EXCEPTIONS
  881. invalid_length =
  882. no_memory =
  883. internal_error =
  884. OTHERS = .
  885. IF sy-subrc = .
  886. CALL FUNCTION 'GENERATE_SEC_RANDOM'
  887. EXPORTING
  888. length =
  889. IMPORTING
  890. random = random
  891. EXCEPTIONS
  892. invalid_length =
  893. no_memory =
  894. internal_error =
  895. OTHERS = .
  896. IF sy-subrc = .
  897. DATA(random_string) = CONV string( random ).
  898. random = random_string().
  899. ENDIF.
  900. ENDIF.
  901.  
  902. init_vector = hex_to_byte( random ).
  903. iv_set = abap_true.
  904.  
  905. ENDMETHOD.
  906.  
  907. METHOD table_copy.
  908.  
  909. DATA(diff) = dst_offset + count - lines( dst ) - .
  910.  
  911. WHILE diff > .
  912. APPEND INITIAL LINE TO dst.
  913. diff = diff - .
  914. ENDWHILE.
  915.  
  916. DATA(src_index) = src_offset.
  917. DATA(dst_index) = dst_offset.
  918.  
  919. DO count TIMES.
  920.  
  921. READ TABLE dst INDEX dst_index ASSIGNING FIELD-SYMBOL(<dst>).
  922. READ TABLE src INDEX src_index ASSIGNING FIELD-SYMBOL(<src>).
  923. IF sy-subrc = .
  924. <dst> = <src>.
  925. ELSE.
  926. CLEAR <dst>.
  927. ENDIF.
  928.  
  929. src_index = src_index + .
  930. dst_index = dst_index + .
  931.  
  932. ENDDO.
  933.  
  934. ENDMETHOD.
  935.  
  936. METHOD table_reverse.
  937.  
  938. DATA: swap TYPE REF TO data.
  939.  
  940. FIELD-SYMBOLS: <swap> TYPE any.
  941.  
  942. DATA(line_type) = CAST cl_abap_tabledescr(
  943. cl_abap_typedescr=>describe_by_data( itab ) )->get_table_line_type( ).
  944.  
  945. CREATE DATA swap TYPE HANDLE line_type.
  946.  
  947. ASSIGN swap->* TO <swap>.
  948.  
  949. DATA(left) = .
  950. DATA(right) = lines( itab ).
  951.  
  952. WHILE left < right.
  953.  
  954. READ TABLE itab INDEX left ASSIGNING FIELD-SYMBOL(<left>).
  955. READ TABLE itab INDEX right ASSIGNING FIELD-SYMBOL(<right>).
  956.  
  957. <swap> = <left>.
  958. <left> = <right>.
  959. <right> = <swap>.
  960.  
  961. left = left + .
  962. right = right - .
  963.  
  964. ENDWHILE.
  965.  
  966. ENDMETHOD.
  967.  
  968. METHOD to_int4.
  969.  
  970. DATA(xlen) = xstrlen( xdata ).
  971.  
  972. IF xlen > .
  973. DATA(offset) = xstrlen( xdata ) - .
  974. int4 = xdata+offset().
  975. ELSEIF xlen < .
  976. DATA(temp) = CONV string( xdata ).
  977. DO - xlen TIMES.
  978. temp = `` && temp.
  979. ENDDO.
  980. int4 = temp.
  981. ELSE.
  982. int4 = xdata.
  983. ENDIF.
  984.  
  985. ENDMETHOD.
  986.  
  987. METHOD word_byte0.
  988. b = round(
  989. val = CONV p1( word / / / MOD )
  990. dec =
  991. mode = cl_abap_math=>round_down ).
  992. ENDMETHOD.
  993.  
  994. METHOD word_byte1.
  995. b = round(
  996. val = CONV p1( word / / MOD )
  997. dec =
  998. mode = cl_abap_math=>round_down ).
  999. ENDMETHOD.
  1000.  
  1001. METHOD word_byte2.
  1002. b = round(
  1003. val = CONV p1( word / MOD )
  1004. dec =
  1005. mode = cl_abap_math=>round_down ).
  1006. ENDMETHOD.
  1007.  
  1008. METHOD word_byte3.
  1009. b = round(
  1010. val = CONV p1( word MOD )
  1011. dec =
  1012. mode = cl_abap_math=>round_down ).
  1013. ENDMETHOD.
  1014.  
  1015. METHOD xor_block.
  1016.  
  1017. DATA(block_length) = lines( block ).
  1018.  
  1019. DATA(block_index) = .
  1020.  
  1021. DO block_length TIMES.
  1022. block[ block_index ] = block[ block_index ] BIT-XOR iv[ block_index ].
  1023. block_index = block_index + .
  1024. ENDDO.
  1025.  
  1026. ENDMETHOD.
  1027. ENDCLASS.

版本支持

ABAP 750及以上。

我原本希望abap-blowfish可以支持740及以上版本,但是在部分语句中,加法会导致INT4类型的变量溢出,不得不使用INT8类型。而ABAP对INT8类型的支持是从750版本开始的。这是一个待解决的问题。

ABAP实现Blowfish加密算法的更多相关文章

  1. php blowfish加密解密具体算法

    PHP Blowfish 算法的加密解密,供大家参考,具体内容如下<?php/*** php blowfish 算法* Class blowfish*/class blowfish{/*** b ...

  2. 常用加密算法简单整理以及spring securiy使用bcrypt加密

    一.哈希加密 1.md5加密 Message Digest Algorithm MD5(中文名为消息摘要算法第五版) https://baike.baidu.com/item/MD5/212708?f ...

  3. 使用bcrypt进行用户密码加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  4. dbcp基本配置和重连配置 -- mysql 8小时自动断开连接的问题

    1. 引入dbcp (选择1.4) Java代码   com.alibaba.external jakarta.commons.dbcp 1.4 2. dbcp的基本配置 相关配置说明: initia ...

  5. 理解php Hash函数,增强密码安全

    1.声明 密码学是一个复杂的话题,我也不是这方面的专家.许多高校和研究机构在这方面都有长期的研究.在这篇文章里,我希望尽量使用简单易懂的方式向你展示一种安全存储Web程序密码的方法. 2.“Hash” ...

  6. linux shadow破解

    主要学习了下linux /etc/shadow文件中密码的破解:学习了hashcat工具的简单实用,具体的可以参加:https://samsclass.info/123/proj10/p12-hash ...

  7. 使用mongoose和bcrypt实现用户密码加密

    前面的话 最近在做的个人项目中,需要对密码进行加密保存,对该操作的详细步骤记录如下 介绍 关于mongoose已经写过博客就不再赘述,下面主要介绍bcrypt bcrypt是一个由两个外国人根据Blo ...

  8. vim 加密(crypt)文本文档

    算法 vim7.3版本支持两种加密方式——PKzip算法(已知有缺陷的).Blowfish算法(从7.3版本开始支持).Blowfish2算法(从7.4.399版本开始支持)而vim -x 默认采用P ...

  9. keystore密钥文件使用的算法-PBKDF2WithHmacSHA1 和Scrypt

    PBKDF2 简单而言就是将salted hash进行多次重复计算,这个次数是可选择的.如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟.假如攻击一个密码所需的rainbow table ...

随机推荐

  1. Qt之键盘事件监听-实时响应大小写Capslock按键

    目录 一.开篇 二.效果展示 三.实现思路 1.重写QLlinEdit 2.全局应用程序事件 3.windows钩子 四.相关文章 原文链接:Qt之键盘事件监听-实时响应大小写Capslock按键 一 ...

  2. cent OS 7 忘记 root 密码

    1. 在如下图, 选择系统的界面 按 e 2. 移动光标到文件底部, 修改如下两个地方(初始化 shell文件 并设置可读写), Ctrl x 退出并启动 shell 3. 如下界面 输入命令 mou ...

  3. 快速开始使用spark

    1.版本说明 在spark2.0版本以前,spakr编程接口是RDD(Resilient Distributed Dataset,弹性分布式数据集),spark2.0版本即以上,RDD被Dataset ...

  4. 无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”

    今天开发C#项目时,有一个需要读取XML的功能点.编码过程中遇到了如标题所示的异常,如下图所示: 查询官网后得知XmlComment是注释节点的类型,如下图所示: 于是得出结论,使用XmlDocume ...

  5. 用.NET做动态域名解析

    用.NET做动态域名解析 动态域名解析,或DNSR,通常用于解析IP地址经常变化的域名.电信网络提供了公网IP,给广大程序员远程办公.内容分享等方面带来了极大的便利.但公网IP是动态的,它会经常变化, ...

  6. 微信小程序开发简述

    微信小程序简述 什么是微信小程序? 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用.全面开放 ...

  7. HNU_小初高数学学习软件_功能说明

    结对编程项目主要功能: 1.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: 2.用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功.密码6-1 ...

  8. 从 Int 到 Integer 对象,细细品来还是有不少东西

    int 是 Java 八大原始类型之一,是 Java 语言中为数不多不是对象的东西,Integer 是 int 的包装类,里面使用了一个 int 类型的变量来存储数据,提供了一些整数之间的常用操作,常 ...

  9. Python 编译器与解释器

    Python 编译器与解释器 Python的环境我们已经搭建好了,可以开始学习基础知识了.但是,在此之前,还要先说说编译器与解释器相关的内容. 如果这部分内容,让你觉得难以理解或不能完全明白,可以暂时 ...

  10. springboot全局异常拦截源码解读

    在springboot中我们可以通过注解@ControllerAdvice来声明一个异常拦截类,通过@ExceptionHandler获取拦截类抛出来的具体异常类,我们可以通过阅读源码并debug去解 ...