in src/main/java/org/apache/commons/codec/digest/UnixCrypt.java [207:259]
public static String crypt(final byte[] original, String salt) {
if (salt == null) {
final ThreadLocalRandom randomGenerator = ThreadLocalRandom.current();
final int numSaltChars = SALT_CHARS.length;
salt = "" + SALT_CHARS[randomGenerator.nextInt(numSaltChars)] +
SALT_CHARS[randomGenerator.nextInt(numSaltChars)];
} else if (!salt.matches("^[" + B64.B64T_STRING + "]{2,}$")) {
throw new IllegalArgumentException("Invalid salt value: " + salt);
}
final StringBuilder buffer = new StringBuilder(" ");
final char charZero = salt.charAt(0);
final char charOne = salt.charAt(1);
buffer.setCharAt(0, charZero);
buffer.setCharAt(1, charOne);
final int eSwap0 = CON_SALT[charZero];
final int eSwap1 = CON_SALT[charOne] << 4;
final byte[] key = new byte[8];
Arrays.fill(key, (byte) 0);
final int originalLength = original.length;
for (int i = 0; i < key.length && i < originalLength; i++) {
final int iChar = original[i];
key[i] = (byte) (iChar << 1);
}
final int[] schedule = desSetKey(key);
final int[] out = body(schedule, eSwap0, eSwap1);
final byte[] b = new byte[9];
intToFourBytes(out[0], b, 0);
intToFourBytes(out[1], b, 4);
b[8] = 0;
int i = 2;
int y = 0;
int u = 128;
for (; i < 13; i++) {
int j = 0;
int c = 0;
for (; j < 6; j++) {
c <<= 1;
if ((b[y] & u) != 0) {
c |= 0x1;
}
u >>>= 1;
if (u == 0) {
y++;
u = 128;
}
buffer.setCharAt(i, (char) COV2CHAR[c]);
}
}
return buffer.toString();
}