Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.ignatieff.stegotext;
- public class Encoder {
- private static char ZERO_SPACE = (char)65279;
- public String encodingString;
- public Encoder(String string){
- encodingString = string;
- }
- public static String encodeString(String plainText, String hiddenMessage){
- Encoder e = new Encoder(plainText);
- return e.encodeString(hiddenMessage);
- }
- private String encodeString(String s){
- if(!canFit(s))return "ERROR: Input string too large.";
- Bits b = new Bits(s);
- System.out.println(b.toString());
- int index = 0;
- StringBuilder r = new StringBuilder();
- while(index<encodingString.length()-b.numZero()){
- r.append(encodingString.charAt(index));
- index++;
- }
- for(int i=0; i<b.bits.length; i++){
- if(b.bits[i]){
- r.append(ZERO_SPACE);
- }else{
- r.append(encodingString.charAt(index));
- index++;
- }
- }
- return r.toString();
- }
- public static String getMessage(String s){
- boolean[] b = new boolean[s.length()];
- for(int i=0; i<s.length(); i++){
- char c = s.charAt(i);
- if(c==ZERO_SPACE)b[i]=true;
- }
- Bits bits = new Bits(b);
- return new Bits(bits.getInt()).getText();
- }
- private boolean canFit(String s){
- if(new Bits(s).numZero()>encodingString.length()+1)return false;
- return true;
- }
- }
- public class Bits {
- public boolean[] bits;
- public Bits(String s){
- this(s.toCharArray());
- }
- public Bits(char c, int len){
- this(translateChar(c),len);
- }
- public Bits(char[] s){
- Bits b = new Bits();
- for(int i=0; i<s.length; i++){
- b.appendBits(new Bits(s[i],5));
- }
- setEqual(b);
- }
- public int numZero(){
- int r = 0;
- for(int i=0; i<bits.length; i++){
- if(!bits[i])r++;
- }
- return r;
- }
- public static char translateInt(int i){
- switch(i){
- case 0:
- return 'Z';
- case 1:
- return 'Q';
- case 2:
- return '!';
- case 3:
- return 'G';
- case 4:
- return 'J';
- case 5:
- return 'F';
- case 6:
- return '\'';
- case 7:
- return 'U';
- case 8:
- return 'X';
- case 9:
- return 'Y';
- case 10:
- return 'V';
- case 11:
- return 'L';
- case 12:
- return 'K';
- case 13:
- return 'D';
- case 14:
- return 'R';
- case 15:
- return 'E';
- case 16:
- return '?';
- case 17:
- return 'P';
- case 18:
- return ',';
- case 19:
- return '.';
- case 20:
- return '.';
- case 21:
- return 'C';
- case 22:
- return 'S';
- case 23:
- return 'T';
- case 24:
- return 'B';
- case 25:
- return 'W';
- case 26:
- return 'H';
- case 27:
- return 'A';
- case 28:
- return 'N';
- case 29:
- return 'O';
- case 30:
- return 'I';
- case 31:
- return ' ';
- }
- return '#';
- }
- public static int translateChar(char c){
- switch((""+c).toUpperCase().charAt(0)){
- case ' ':
- return 31;
- case 'E':
- return 15;
- case 'T':
- return 23;
- case 'A':
- return 27;
- case 'O':
- return 29;
- case 'I':
- return 30;
- case 'N':
- return 28;
- case 'H':
- return 26;
- case 'S':
- return 22;
- case 'R':
- return 14;
- case 'D':
- return 13;
- case 'L':
- return 11;
- case 'U':
- return 7;
- case 'M':
- return 19;
- case 'C':
- return 21;
- case 'W':
- return 25;
- case 'G':
- return 3;
- case 'F':
- return 5;
- case 'Y':
- return 9;
- case 'P':
- return 17;
- case ',':
- return 18;
- case '.':
- return 20;
- case 'B':
- return 24;
- case 'K':
- return 12;
- case 'V':
- return 10;
- case '\'':
- return 6;
- case '?':
- return 16;
- case 'X':
- return 8;
- case 'J':
- return 4;
- case '!':
- return 2;
- case 'Q':
- return 1;
- case 'Z':
- return 0;
- }
- return -1;
- }
- public Bits(){
- this(0,0);
- }
- public Bits(int num){
- this(num, (int)Math.ceil(log2(num)));
- }
- public Bits(int num, int len){
- bits = new boolean[len];
- for(int i=0; i<len; i++){
- bits[i]=getBit(num,len-(i));
- }
- }
- public Bits(boolean[] bitset){
- bits=bitset;
- }
- private void setEqual(Bits b){
- bits = b.bits;
- }
- public void appendBits(Bits b){
- Bits q = appendBits(this,b);
- setEqual(q);
- }
- public Bits subBit(int beginIndex, int endIndex){
- int beginThis = bits.length-beginIndex-1;
- int dx = endIndex-beginIndex;
- boolean[] b = new boolean[dx];
- for(int i=0; i<dx; i++){
- b[dx-i-1] = bits[beginThis-i];
- }
- return new Bits(b);
- }
- public String getText(){
- if(bits.length%5!=0){return "ERROR: Not a text string.";}
- StringBuilder s = new StringBuilder();
- int b = bits.length/5;
- for(int i=0; i<b; i++){
- Bits sub = subBit(5*i, 5*(i+1));
- s.append(sub.getChar());
- }
- return s.toString();
- }
- public char getChar(){
- if(bits.length>5)return '#';
- return translateInt(getInt());
- }
- public int getInt(){
- int r=0;
- for(int i=0; i<bits.length; i++){
- int d=bits.length-i-1;
- if(bits[d])r+=(int)Math.pow(2, i);
- }
- return r;
- }
- public static Bits appendBits(Bits b1, Bits b2){
- boolean[] b = new boolean[b1.bits.length+b2.bits.length];
- for(int i=0; i<b2.bits.length; i++){
- b[i]=b2.bits[i];
- }
- for(int i=0; i<b1.bits.length; i++){
- b[b2.bits.length+i]=b1.bits[i];
- }
- return new Bits(b);
- }
- public String toString(){
- if(bits.length==0)return "[]";
- StringBuilder s = new StringBuilder();
- s.append("[ ");
- for(int i=0; i<bits.length; i++){
- if(bits[i]){s.append("1");}else{s.append("0");}
- s.append(", ");
- }
- String q = s.toString();
- return q.substring(0,q.length()-2)+" ]";
- }
- private static boolean getBit(int decimal, int N){
- int constant = 1 << (N-1);
- return ((decimal & constant)!=0);
- }
- private static double log2(int num){
- return Math.log(num)/Math.log(2);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement