Advertisement
Guest User

Steganography for Unicode MK-II

a guest
Dec 5th, 2013
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.79 KB | None | 0 0
  1. package com.ignatieff.stegotext;
  2.  
  3. public class Encoder {
  4.  
  5. private static char ZERO_SPACE = (char)65279;
  6.  
  7. public String encodingString;
  8.  
  9. public Encoder(String string){
  10. encodingString = string;
  11. }
  12.  
  13. public static String encodeString(String plainText, String hiddenMessage){
  14. Encoder e = new Encoder(plainText);
  15. return e.encodeString(hiddenMessage);
  16. }
  17.  
  18. private String encodeString(String s){
  19. if(!canFit(s))return "ERROR: Input string too large.";
  20. Bits b = new Bits(s);
  21. System.out.println(b.toString());
  22. int index = 0;
  23. StringBuilder r = new StringBuilder();
  24. while(index<encodingString.length()-b.numZero()){
  25. r.append(encodingString.charAt(index));
  26. index++;
  27. }
  28. for(int i=0; i<b.bits.length; i++){
  29. if(b.bits[i]){
  30. r.append(ZERO_SPACE);
  31. }else{
  32. r.append(encodingString.charAt(index));
  33. index++;
  34. }
  35. }
  36. return r.toString();
  37. }
  38.  
  39. public static String getMessage(String s){
  40. boolean[] b = new boolean[s.length()];
  41. for(int i=0; i<s.length(); i++){
  42. char c = s.charAt(i);
  43. if(c==ZERO_SPACE)b[i]=true;
  44. }
  45. Bits bits = new Bits(b);
  46. return new Bits(bits.getInt()).getText();
  47. }
  48.  
  49. private boolean canFit(String s){
  50. if(new Bits(s).numZero()>encodingString.length()+1)return false;
  51. return true;
  52. }
  53.  
  54.  
  55. }
  56. public class Bits {
  57. public boolean[] bits;
  58.  
  59. public Bits(String s){
  60. this(s.toCharArray());
  61. }
  62.  
  63. public Bits(char c, int len){
  64. this(translateChar(c),len);
  65. }
  66.  
  67. public Bits(char[] s){
  68. Bits b = new Bits();
  69. for(int i=0; i<s.length; i++){
  70. b.appendBits(new Bits(s[i],5));
  71. }
  72. setEqual(b);
  73. }
  74.  
  75. public int numZero(){
  76. int r = 0;
  77. for(int i=0; i<bits.length; i++){
  78. if(!bits[i])r++;
  79. }
  80. return r;
  81. }
  82.  
  83. public static char translateInt(int i){
  84. switch(i){
  85. case 0:
  86. return 'Z';
  87. case 1:
  88. return 'Q';
  89. case 2:
  90. return '!';
  91. case 3:
  92. return 'G';
  93. case 4:
  94. return 'J';
  95. case 5:
  96. return 'F';
  97. case 6:
  98. return '\'';
  99. case 7:
  100. return 'U';
  101. case 8:
  102. return 'X';
  103. case 9:
  104. return 'Y';
  105. case 10:
  106. return 'V';
  107. case 11:
  108. return 'L';
  109. case 12:
  110. return 'K';
  111. case 13:
  112. return 'D';
  113. case 14:
  114. return 'R';
  115. case 15:
  116. return 'E';
  117. case 16:
  118. return '?';
  119. case 17:
  120. return 'P';
  121. case 18:
  122. return ',';
  123. case 19:
  124. return '.';
  125. case 20:
  126. return '.';
  127. case 21:
  128. return 'C';
  129. case 22:
  130. return 'S';
  131. case 23:
  132. return 'T';
  133. case 24:
  134. return 'B';
  135. case 25:
  136. return 'W';
  137. case 26:
  138. return 'H';
  139. case 27:
  140. return 'A';
  141. case 28:
  142. return 'N';
  143. case 29:
  144. return 'O';
  145. case 30:
  146. return 'I';
  147. case 31:
  148. return ' ';
  149. }
  150. return '#';
  151. }
  152.  
  153. public static int translateChar(char c){
  154. switch((""+c).toUpperCase().charAt(0)){
  155. case ' ':
  156. return 31;
  157. case 'E':
  158. return 15;
  159. case 'T':
  160. return 23;
  161. case 'A':
  162. return 27;
  163. case 'O':
  164. return 29;
  165. case 'I':
  166. return 30;
  167. case 'N':
  168. return 28;
  169. case 'H':
  170. return 26;
  171. case 'S':
  172. return 22;
  173. case 'R':
  174. return 14;
  175. case 'D':
  176. return 13;
  177. case 'L':
  178. return 11;
  179. case 'U':
  180. return 7;
  181. case 'M':
  182. return 19;
  183. case 'C':
  184. return 21;
  185. case 'W':
  186. return 25;
  187. case 'G':
  188. return 3;
  189. case 'F':
  190. return 5;
  191. case 'Y':
  192. return 9;
  193. case 'P':
  194. return 17;
  195. case ',':
  196. return 18;
  197. case '.':
  198. return 20;
  199. case 'B':
  200. return 24;
  201. case 'K':
  202. return 12;
  203. case 'V':
  204. return 10;
  205. case '\'':
  206. return 6;
  207. case '?':
  208. return 16;
  209. case 'X':
  210. return 8;
  211. case 'J':
  212. return 4;
  213. case '!':
  214. return 2;
  215. case 'Q':
  216. return 1;
  217. case 'Z':
  218. return 0;
  219. }
  220. return -1;
  221. }
  222.  
  223. public Bits(){
  224. this(0,0);
  225. }
  226.  
  227. public Bits(int num){
  228. this(num, (int)Math.ceil(log2(num)));
  229. }
  230.  
  231. public Bits(int num, int len){
  232. bits = new boolean[len];
  233. for(int i=0; i<len; i++){
  234. bits[i]=getBit(num,len-(i));
  235. }
  236. }
  237.  
  238. public Bits(boolean[] bitset){
  239. bits=bitset;
  240. }
  241.  
  242. private void setEqual(Bits b){
  243. bits = b.bits;
  244. }
  245.  
  246. public void appendBits(Bits b){
  247. Bits q = appendBits(this,b);
  248. setEqual(q);
  249. }
  250.  
  251. public Bits subBit(int beginIndex, int endIndex){
  252. int beginThis = bits.length-beginIndex-1;
  253. int dx = endIndex-beginIndex;
  254. boolean[] b = new boolean[dx];
  255. for(int i=0; i<dx; i++){
  256. b[dx-i-1] = bits[beginThis-i];
  257. }
  258. return new Bits(b);
  259. }
  260.  
  261. public String getText(){
  262. if(bits.length%5!=0){return "ERROR: Not a text string.";}
  263. StringBuilder s = new StringBuilder();
  264. int b = bits.length/5;
  265. for(int i=0; i<b; i++){
  266. Bits sub = subBit(5*i, 5*(i+1));
  267. s.append(sub.getChar());
  268. }
  269. return s.toString();
  270. }
  271.  
  272. public char getChar(){
  273. if(bits.length>5)return '#';
  274. return translateInt(getInt());
  275. }
  276.  
  277. public int getInt(){
  278. int r=0;
  279. for(int i=0; i<bits.length; i++){
  280. int d=bits.length-i-1;
  281. if(bits[d])r+=(int)Math.pow(2, i);
  282. }
  283. return r;
  284. }
  285.  
  286. public static Bits appendBits(Bits b1, Bits b2){
  287. boolean[] b = new boolean[b1.bits.length+b2.bits.length];
  288. for(int i=0; i<b2.bits.length; i++){
  289. b[i]=b2.bits[i];
  290. }
  291. for(int i=0; i<b1.bits.length; i++){
  292. b[b2.bits.length+i]=b1.bits[i];
  293. }
  294. return new Bits(b);
  295. }
  296.  
  297. public String toString(){
  298. if(bits.length==0)return "[]";
  299. StringBuilder s = new StringBuilder();
  300. s.append("[ ");
  301. for(int i=0; i<bits.length; i++){
  302. if(bits[i]){s.append("1");}else{s.append("0");}
  303. s.append(", ");
  304. }
  305. String q = s.toString();
  306. return q.substring(0,q.length()-2)+" ]";
  307. }
  308.  
  309. private static boolean getBit(int decimal, int N){
  310. int constant = 1 << (N-1);
  311. return ((decimal & constant)!=0);
  312. }
  313.  
  314. private static double log2(int num){
  315. return Math.log(num)/Math.log(2);
  316. }
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement