package com.framework.utils.security; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Created with IntelliJ IDEA ( LivePerson : www.liveperson.com ) * * Package: org.framework.webdriver.utils * * Name : Cipher * * User : solmarkn / Dani Vainstein * * Date : 2014-12-14 * * Time : 14:26 */ public class Cipher { //region Cipher - Variables Declaration and Initialization Section. private static final Logger logger = LoggerFactory.getLogger( Cipher.class ); protected long prime = NumberUtils.createLong( "12433" ); private long multiplier = NumberUtils.createLong( "8629" ); protected long seed; protected int abLen = NumberUtils.createInteger( "10" ); protected long reg; //endregion //region Cipher - Constructor Methods Section protected Cipher() { super(); } //endregion //region Cipher - Public Methods Section public static boolean isPrimeNumber( Long num ) { Double sqrt = Math.sqrt( num ); for( long i = 2 ; i < sqrt ; i++ ) { if( num % i == 0 ) { return false; } } return true; } public static long findPrime( long from ) { long num; for( num = from; num > 0 ; num++ ) { if( isPrimeNumber( num ) ) { return num; } } return 0; } public void setParams( long multiplier, long prime, int ablen ) { this.prime = prime; this.multiplier = multiplier; this.abLen = ablen; } public void seed( long seed ) { this.seed = seed; if( this.seed < prime / 2 ) { this.seed = prime - this.seed; } this.reg = this.seed; } public int nextKey() { long reg1 = ( reg * this.multiplier ) % prime; int key = ( int ) ( reg1 % abLen ); reg = ( reg * abLen + key ) % prime; return key; } public int encipher( long num ) { int key = nextKey(); int enc = mod( num + key, abLen ); logger.trace( "encipher( {} ) -> {}", num, enc ); return enc; } public int decipher( long num ) { int key = nextKey(); int dec = mod( num - key, abLen ); logger.trace( "decipher( {} ) -> {}", num, dec ); return dec; } public String encipher( String s, long seed, boolean encipher ) { seed( seed ); String enc = StringUtils.EMPTY; for( int i = 0 ; i < s.length() ; i++ ) { char c = s.charAt( i ); int dig = Character.digit( c, abLen ); int edig = encipher ? encipher( dig ) : decipher( dig ); enc += Character.forDigit( edig, abLen ); } return enc; } public long getReg() { return reg; } //endregion //region Cipher - Protected Methods Section //endregion //region Cipher - Private Function Section private static int mod( long n, long m ) { long r = n % m; if( r < 0 ) { r += m; } return ( int ) r; } //endregion }