Pergunta

Quais são os fundamentos para realizar a criptografia de dados com exatamente duas teclas (que podem ser baseados em senha), mas a necessidade de somente um (ou uma) das duas chaves para descriptografar os dados?

Por exemplo, dados são criptografados com a senha do usuário e de sua empresa de palavra-passe e, em seguida, ele ou sua empresa poderá descriptografar os dados.Nenhum deles sabe que o outro senha.Apenas uma cópia dos dados criptografados são armazenados.

Eu não quero chave pública/privada.Provavelmente através de criptografia de chave simétrica e, talvez, envolve algo como XORing as teclas em conjunto para usá-los para a criptografia.

Atualização:Eu também gostaria de encontrar uma solução que não envolve o armazenamento de chaves em todos os.

Foi útil?

Solução

A forma como isto é usualmente feito é para gerar uma única chave simétrica para criptografar os dados.Em seguida, você criptografar a chave simétrica com chave de cada destinatário ou a senha para que eles possam decifrá-lo por conta própria.S/MIME (na verdade, o Cryptographic Message Syntax em que o S/MIME é baseado) utiliza esta técnica.

Dessa forma, você só tem que armazenar uma cópia da mensagem criptografada, mas várias cópias da chave.

Outras dicas

Geralmente falando, o que você faz é criptografar os dados com uma chave gerada aleatoriamente e, em seguida, acrescentar as versões de que a chave aleatória que foram criptografados com todas as chaves conhecidas.Assim, qualquer pessoa com uma chave válida pode descobrir o 'real' chave que foi usada para criptografar os dados.

Se eu entendi bem, você tem alguns dados que você deseja criptografar e distribuir a chave de criptografia dividido em n 'peças-chave'.(No seu caso 2 peças)

Para isso você pode usar o XOR com base dividir, aqui está como funciona:Você fornece o número necessário de peças - n, e a chave secreta – K.Para gerar n peças de sua chave, você precisará criar (n – 1) números aleatórios:R1, R2, R3, ..., Rn−1.Para isso você pode usar um SecureRandom gerador de número, que vai nos impedir de duplicatas.Então você operar XOR a função nestes Rn-1 peças e a sua chave - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ K

Agora você tem o seu n peças:R1, R2, R3, ..., Rn-1, Rn e você pode destruir o K.Essas peças podem ser espalhados no seu código ou enviadas para os usuários.

Para remontar a chave, usamos operação XOR no nosso Rn peças:
K = R1 ⊕ R2 ⊕ R3 ⊕ ...⊕ Rn−1 ⊕ Rn

Com a função XOR (⊕) cada parte é intrinsecamente importante na reconstrução da chave, se qualquer bits em qualquer das peças são alteradas, em seguida, a tecla não é recuperável.

Para mais informações e código, você pode ter um olhar para o Android que eu escrevi para essa finalidade:
O GitHub Do Projeto: https://github.com/aivarsda/Secret-Key-Split-Util

Você também pode tentar a Chave Secreta Divisor de demonstração do aplicativo que usa o Utilitário :
GooglePlay: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter

Eu acho que eu pensei em uma solução que iria trabalhar:

D = data to encrypt
h1 = hash(userpassword)
h2 = hash(companyPassword)
k = h1 concat h2

E = function to encrypt
//C is the encrypted data
C = E_h1(h2) concat E_h2(h1) concat E_k(D)

Então qualquer pessoa pode descriptografar o hash da outra pessoa, e, em seguida, combiná-los para descriptografar o resto dos dados.

Talvez haja uma solução melhor do que isso, porém?

No caso mais geral, um segredo (nesta aplicação, uma chave de descriptografia de dados) pode ser dividido em ações, que algumas limite de número dessas ações é necessário para recuperar o segredo.Isso é conhecido como o segredo de partilha ou com n ações e um limiar de t, a (t,n)-limite de regime.

Uma forma este pode ser feito é a criação de um polinˆ omio de ordem t-1, estabelecendo o segredo como o primeiro coeficiente, e escolhendo o resto dos coeficientes de forma aleatória.Em seguida, n aleatória de pontos desta curva são selecionadas e tornam-se ações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top