11import { ICryptor } from "." ;
22import Cryptor1 from "./cryptor1" ;
3- import Salt from "./salt" ;
4- import { password2Number , toUnicodeArray } from "./util" ;
3+ import { password2Number , ring } from "./algorithm/string-process" ;
54
65/**
76 * The second version of cryptor
@@ -23,26 +22,85 @@ export default class Cryptor2 extends Cryptor1 implements ICryptor {
2322 }
2423
2524 encript ( plain : string , password : string ) : string {
26- const charArr : Array < number > = toUnicodeArray ( plain )
27-
2825 let pn : number = password2Number ( password )
2926 const salt : Salt = new Salt ( )
3027 salt . calcSalt ( pn )
3128 pn = salt . getNewPn ( )
3229
33- const cipher = charArr . map ( value => value ^ pn ) . map ( c => String . fromCharCode ( c ) ) . join ( "" )
34- return salt . getPrefix ( ) + cipher
30+ const cipher = ring ( pn , plain )
31+ return String . fromCharCode ( salt . getPrefixUnicode ( ) ) + cipher
3532 }
3633
3734 decrypt ( cipher : string , password : string ) : string {
3835 let pn : number = password2Number ( password )
3936
4037 const salt : Salt = new Salt ( )
41- salt . parseSalt ( pn , cipher )
38+ salt . parseSalt ( pn , cipher . charCodeAt ( 0 ) )
4239 pn = salt . getNewPn ( )
4340
44- const charArr : Array < number > = toUnicodeArray ( cipher . substring ( 1 ) )
41+ return ring ( pn , cipher . substring ( 1 ) )
42+ }
43+ }
44+
45+
46+ /**
47+ * Salt for ramdon cipher
48+ *
49+ * @since 1.1.1
50+ */
51+ class Salt {
52+ private static ZERO_BASE = 0x4e00
53+ private static MASK_SEGMENT = [ 7 , 15 , 31 , 63 , 127 , 255 ]
54+ private static ZH_LENGTH = 1 << 10 // = 1024
55+
56+ mask : number
57+ salt : number
58+ pn : number
59+
60+ /**
61+ * Generate salt
62+ *
63+ * @param pn
64+ */
65+ calcSalt ( pn : number ) : void {
66+ this . pn = pn
67+ this . calcMask ( )
68+ while ( ! this . isValid ( ) ) {
69+ this . circle ( )
70+ }
71+ }
72+
73+ parseSalt ( pn : number , cipherSaltCode : number ) {
74+ this . pn = pn
75+ this . calcMask ( )
76+ this . salt = ( cipherSaltCode - Salt . ZERO_BASE ) * ( this . mask + 1 ) / Salt . ZH_LENGTH
77+ }
78+
79+ private isValid ( ) : boolean {
80+ return ! ! this . getNewPn ( ) // newPn != 0
81+ }
82+
83+ private circle ( ) {
84+ this . salt = new Date ( ) . getTime ( ) & this . mask
85+ }
86+
87+ private calcMask ( ) {
88+ let mask : number
89+ for ( let i = 0 ; i < Salt . MASK_SEGMENT . length ; i ++ ) {
90+ mask = Salt . MASK_SEGMENT [ i ]
91+ if ( this . pn < mask ) {
92+ this . mask = mask
93+ break
94+ }
95+ }
96+ this . mask = mask
97+ }
98+
99+ getNewPn ( ) : number {
100+ return this . pn + this . salt
101+ }
45102
46- return charArr . map ( value => value ^ pn ) . map ( c => String . fromCharCode ( c ) ) . join ( "" )
103+ getPrefixUnicode ( ) : number {
104+ return ( this . salt * Salt . ZH_LENGTH / ( this . mask + 1 ) ) + Salt . ZERO_BASE
47105 }
48106}
0 commit comments