0.0.2 • Published 7 years ago

rsa-proxy-reencrypt v0.0.2

Weekly downloads
7
License
MIT
Repository
github
Last release
7 years ago

rsa-proxy-reencrypt

Build Status

Proxy Re-encryption library for Javascript using RSA cryptography

Introduction

This library is based on the suggested implementation in Section 4.3, Dodis, Y. and Ivan, A. 2003. Proxy cryptography revisited. In Proceedings of the Tenth Network and Distributed System Security Symposium..

This package is intended as native Javascript implementation which allows the following functionality:

  • Encrypting data*
  • Decrypting data**
  • Generating Re-encryption keys***
  • Re-encrypting data***

*Data must currently be a string **Data must have been encrypted using this scheme ***Not-yet implemented

Usage

Encrypting data

// Generate a key / Use existing key
import forge from 'node-forge'
const rsa = forge.pki.rsa
const key = rsa.generateKeyPair({ bits: 2048 })

// Get a data url
import { sync as DataURI } from 'datauri'
const data = DataURI('./some/file/path')

import RSAProxyReencrypt from 'rsa-proxy-reencrypt'

const encrypter = new RSAProxyReencrypt({ rsa: key })

const encrypted = encrypter.encrypt(data)

Decrypting data

// Use existing key
import forge from 'node-forge'
const rsa = forge.pki.rsa
const key = rsa.generateKeyPair({ bits: 2048 })

import RSAProxyReencrypt from 'rsa-proxy-reencrypt'

const encrypter = new RSAProxyReencrypt({ rsa: key })

// Assume encrypted is data previously encrypted by this scheme
const decrypted = encrypter.decrypt(encrypted)

Generating Re-encryption Keys

Proposed

Reencrypting data

Proposed

// Use existing key
import forge from 'node-forge'
const rsa = forge.pki.rsa
const ownerPrivateKey = rsa.generateKeyPair({ bits: 2048 }).privateKey
const userPublicKey = rsa.generateKeyPair({ bits: 2048}).publicKey

import RSAProxyReencrypt from 'rsa-proxy-reencrypt'

// ------------------------------------------------------------
// OWNER
// ------------------------------------------------------------
const encrypter = new RSAProxyReencrypt({
  rsa: { privateKey: ownerPrivateKey }
})
const { proxyKey, userKey } = encrypter.generateReencryptionKey(userPublicKey)
const ownerDecryptable = encrypter.encrypt('some data uri')

// ------------------------------------------------------------
// PROXY
// ------------------------------------------------------------
const proxyEncrypter = new RSAProxyReencrypt({
  rsa: { privateKey: proxyKey }
})
const userDecryptable = proxyEncrypter.decrypt(ownerDecryptable, { partial: true })

// ------------------------------------------------------------
// USER
// ------------------------------------------------------------
const userEncrypter = new RSAProxyReencrypt({
  rsa: { privateKey: userKey }
})
const message = proxyEncrypter.decrypt(userDecryptable)