PHP uygulanacak basit şifreleme sorun

6 Cevap php

Aşağıdaki fonksiyonları yerine bir çift uygulamak gerekir:

  1. fonksiyonu genkey: bir dize q (bu bir MD5 veya SHA karma olabilir) ve bir tohum dize verilen fonksiyon yeni bir dize p oluşturmak gerekir

  2. fonksiyonu checkKey: Bir dize dize p q elde eğer bu işlev (önceki işlevini kullanarak) return true olmalı

Seudo-kodu üzerinde bir şey olurdu bu yalan:

p=genKey(q,seed) ; // generate string p from q and seed 

checkKey(p,q)==true ; // if p was generated from q, then this must return true. False otherwise.

Does anyone know about existing algorithms that do such thing??
I can implement the algorithms myself if there are no known implementations for PHP, so what I'm really asking is for the procedure to accomplish this.

6 Cevap

Bu tartışma let p == karma (q)

Daha sonra kolayca özel bir anahtarla 'p' imzalamak ve sahibi 'p' birlikte bu imza tutmak için php ile OpenSSL'yi kullanabilirsiniz.

Bu sizin özel anahtar ile eşleştirilmiş ortak anahtarını kullanarak imza karşılığı 'p' kontrol etmek için OpenSSL işlevini doğrulamak kullanımı sonra basittir. Bu durumda, 'p' doğrulamak için veri olacaktır.

openssl_sign ve openssl_verify bilgi ve veri imzalamak ve doğrulamak için php OpenSSL'yi örnekleri için bkz:

Eğer bir MAC açıklamak için çalışıyor olabilir gibi geliyor.

Bir mesaj doğrulama kodu bir mesaj özeti, bir sır, ve mesajı alır. Gizli ve veri birlikte karma, ve sonuç mesajı ile dahil edilir.

Sırrını bilen bir mesaj alıcısı aynı sindirmek hesaplama yapmak ve alınan mesajı eşlik birine onun MAC karşılaştırabilirsiniz. Eşit iseler, o iletinin değiştirilmediğini olmadığını güvenebilirsiniz.


Yorumlarınızı göz önüne alındığında, ben yerine bir MAC kullanılacak bir gizli anahtar, daha asimetrik tuşları ile çalışıyorsanız şimdi anlıyorum.

Ancak, biraz karışıklık hala var. Normalde, bir özel imza anahtarı bu durumda müşteri gibi görünüyor sahibi tarafından gizli tutulur. Bir istemci kriptografik onlar özel anahtar açıklamadan ortak bir anahtara karşılık gelen bir özel anahtar sahip olduğunu kanıtlayabilirim.

Dijital imza kullanarak, böyle bir şey yapabilirsiniz:

p = genKey(pvt, seed)
checkKey(pub, p)

Burada, pvt sunucunun özel anahtarı, pub kamu anahtarıdır. seed parametresi imzalanan alır veridir. Ben başvurunuzu (hangi şüphe) anlamak, seed müşteri tanımlayıcı olmalıdır. Sonra p seed ve birlikte imza demetleri bir ileti biçimidir. q üreten hem de kullanılan ve doğrulanması p gibi paylaşılan bir sır çünkü senin soru kafa karıştırıcı.

Ancak, başka bir değerini kullanarak bir istemci durdurmak için bu düzeni (veya MAC düzeni) hiçbir şey yok p. Eğer böyle bir tekniği ile yapabileceğiniz her mesajın içeriği değiştirilmediğini sağlamaktır. Örneğin, mesaj "İstemciKimliği = Alice, IPAdresi = 192.168.1.1", Mallory Alice'in için kendi IP adresi yerine vermedi emin olabilirsiniz gibi bir şey olup olmadığını.

Mesajı sadece Ama eğer "İstemciKimliği = Alice", sen (bir lisans maliyeti bölme karşılığında) Bob'a onu sÆzdÆrmaz mesaj vermekten Alice duramazsın, ve Mallory Alice'in sahasının içine kesmek olmadığını kontrol edemez ve mesajı çaldı.

Mesajı bütünlüğü gerçekten ihtiyacınız olduğunu ve kolayca gönderici ve alıcı arasında bir sır paylaşmak eğer arada, MAC gibi çok daha küçük mesaj boyutu ve hızlı performans gibi açık anahtarlı şifrelemeye bazı güzel avantajları var.

Eğer karşı savunmak için çalışıyoruz tehditleri Anahat. Kriptografi zordur. Denenmemiş programları oluşturulması genellikle kötü biter.

Sen böyle bir şey deneyebilirsiniz:

$p = genKey($q,rand());
checkKey($p,$q) == true;


function genkey($q,$seed)
{
    if(array_search($_SESSION['seeds'],$seed) === FALSE)
    {
        $_SESSION['seeds'][] = $seed;
    }
    return hash("sha512", $q . $seed);
}

function checkKey($p,$q)
{
    $returnVal = false;
    foreach($_SESSION['seeds'] AS $s)
    {
        if(hash("sha512", $q . $s) == $p)
        {
            $returnVal = true;
            break;
        }
    }
    return $returnVal;
}

Tabii ki, ben geçerli tohumların depolanması için başka bir şey tavsiye ederim, ama bu kavramın sadece bir kanıtıdır.

Sen crypt() , hash() , or md5() kullanabilirsiniz.

Edit: I don't mind the downvote. Looking at the complexity of the other answers, I must have misinterpreted the question. But it would be nice if people would accompany their downvotes with a comment so that I at least know what is wrong with my answer.

Ne soru toplanan sorgulayıcı gibi bir şey uygulamak istediği şudur:

function genKey($q, $seed) {
  // assuming $seed is a properly formatted md5/sha salt
  return crypt($q, $seed);
}

function checkKey($p, $q, $seed) {
  return ($p == genKey($q, $seed));
}

PHP'nin tek yönlü şifreleme işlevlerinin herhangi biri bu gerçekleştirmek için kullanılabileceğini düşünerek yanlış mıyım?

Peki, ne için başvuruyorsunuz özellikle imzaları oluşturma, public key cryptography bir ilkedir. (Eğer uygulamak gerekir), karmaşık matematik ilkeler doğrultusunda çalışır.

Temel RSA imzaları olarak, s aşağıdaki matematik uygulayarak bir imza oluşturabilirsiniz:

s = m^d % n

m mesajı (ya da sizin için dize q) olduğunda, d özel anahtar, n modülü olan (özel ve kamu anahtarı arasında paylaşılan) .

Daha sonra bu matematik ile kontrol edilebilir:

 m = s^e % n

e ortak anahtar nerede.

Tabii tuşları bu iş için özel bir matematiksel standart oluşturulmalıdır. Ve bazen tuşlar muazzam boyutlarda olsun. Yine, tüm bu tamsayılar üzerinden yapılır, böylece ondalık içine ve geri metne dönüştürmek gerekir.

Daha fazla bilgi ve daha fazla matematik, kontrol this page.

EDIT: Sana ortak anahtar şifreleme kullanmak isteyeyim neden bahsetmek gerektiğini düşündüm. Temelde, iki şeylere karşı korur: mesajı doğrulanabilir ve sahte olamaz.

Kontrol yan tohum erişimi olacak? Tohum (bir web uygulaması gibi) kontrol tarafta güvenli bir şekilde muhafaza edilebilir ise kolayca HTTP Digest kimlik MD5 kullanarak yok gibi bir şey yapabilirdi.

Pseudocode:

   function genKey(q) {
      p = md5sum(q . ':' . seed);
      return p;
   }

   function checkKey(p,q) {
      return md5sum(q . ':' . seed) == p;
   }

Eğer "imza" doğrulamak için ikinci bir partiye ihtiyaç varsa o zaman muhtemelen sadece PKI kullanmak isteyeceksiniz.