Пример #1
0
 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;
 }
Пример #2
0
        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);
        }