public SaltShaker(char minChar, char maxChar, int saltLength, SaltCreationModel creationModel, SaltEmbeddingModel embedModel, int seed) { MethodContract.Assert(minChar < maxChar, nameof(minChar) + " must be less than " + nameof(maxChar)); MethodContract.Assert(saltLength > 0, nameof(saltLength)); this.seed = seed; this.model = creationModel; this.embed = embedModel; this.minChar = minChar; this.maxChar = maxChar; this.saltLength = saltLength; }
public static string EmbedSalt(SaltEmbeddingModel model, string payload, string salt) { if (!string.IsNullOrEmpty(payload)) { if (!string.IsNullOrEmpty(salt)) { if (salt.Length > payload.Length) { if (model == SaltEmbeddingModel.Default || model == SaltEmbeddingModel.Randomized) { int hash = Math.Abs(payload.GetHashCode()); //calc the entropy while (hash > salt.Length) { hash = hash - salt.Length; } //ok, hash is still positive, but now less than salt.length so we can embed char[] front = payload.ToCharArray(); char[] back = salt.ToCharArray(); if (hash + front.Length < back.Length) //direct embed { for (int i = 0; i < front.Length; i++) { back[hash + i] = front[i]; } } else //need to do a wrap around like a circular array { int wrapIndex = back.Length - hash; for (int i = 0; i < front.Length; i++) { if (hash + i < back.Length) { back[hash + i] = front[i]; } else { back[i - wrapIndex] = front[i]; } } } return(new string(back)); } else if (model == SaltEmbeddingModel.Middle) //goes in the middle { char[] front = payload.ToCharArray(); char[] back = salt.ToCharArray(); int start = (back.Length - front.Length) / 2; for (int i = 0; i < front.Length; i++) { back[start + i] = front[i]; } return(new string(back)); } else if (model == SaltEmbeddingModel.Beginning) //easiest one to do { char[] data = salt.ToCharArray(); for (int i = 0; i < payload.Length; i++) { data[i] = payload[i]; } return(new string(data)); } else //end { char[] data = salt.ToCharArray(); int indexBase = data.Length - payload.Length; //first spot to replace for (int i = 0; i < payload.Length; i++) { data[indexBase + i] = payload[i]; } return(new string(data)); } } else if (salt.Length == payload.Length) { return(payload); //no extra chars } else { return(payload.Substring(0, salt.Length)); //truncate to salt length } } return(payload); //nothing to embed in } return(salt); }