Working with Encryption
What is encryption?
Encryption scrambles data so only authorized parties can read it. Keymaster creates encrypted asset DIDs that the intended recipient can decrypt. By default, it also stores a sender-encrypted copy so the sender can read the asset later.
Encrypting a file
Encrypt a text file for an agent DID or a local alias:
$ echo 'this is a secret message' > tmp/secret.txt
$ kc encrypt-file tmp/secret.txt bob
did:test:z3v8AuadZVYKXq9oyoWmCgqGREsvMxCKDWxwLHNw3tHpfDyrNr3
Resolving the returned DID exposes only the encrypted asset:
$ kc resolve-did did:test:z3v8AuadZVYKXq9oyoWmCgqGREsvMxCKDWxwLHNw3tHpfDyrNr3
{
"didDocument": {
"@context": [
"https://www.w3.org/ns/did/v1"
],
"id": "did:test:z3v8AuacNPvBNSN8o1LgJxSD9jZVQBkre8BfHdrPgSugb7zuhqs",
"controller": "did:test:z3v8AuagsGQwffFd2oVhkdcTWRBi2ps5FdRAJD4jzEVMszkYBCj"
},
"didDocumentMetadata": {
"created": "2024-03-14T19:39:55.374Z",
"canonicalId": "did:test:z3v8AuadZVYKXq9oyoWmCgqGREsvMxCKDWxwLHNw3tHpfDyrNr3",
"versionId": "z3v8AuadZVYKXq9oyoWmCgqGREsvMxCKDWxwLHNw3tHpfDyrNr3",
"version": "1",
"confirmed": true
},
"didDocumentData": {
"encrypted": {
"cipher_hash": null,
"cipher_receiver": "UsCHFkoWeKbmnPC6rL5K55O2zewCehy9WHGFOuxE_nYZrIpxwn4biSbkqhMO_7iFRWFM7Kv_R78SQOO_GROpF_0ttlQYOg",
"cipher_sender": "fIhBsmICMqN-2nW2FQ2fk-2-DrvQ0EfPyGRa6YUoEywDJdzEtyAW4PBiYnwrgomA0oC5Ox5SeTtCon0ps7baqvHDFDr3aw",
"created": "2024-03-14T19:39:55.374Z",
"sender": "did:test:z3v8AuagsGQwffFd2oVhkdcTWRBi2ps5FdRAJD4jzEVMszkYBCj"
}
},
"mdip": {
"registry": "hyperswarm",
"type": "asset",
"version": 1,
"prefix": "did:test"
},
"didResolutionMetadata": {
"retrieved": "2024-03-14T19:40:01.000Z"
}
}
Encrypting a message
Messages use the same encrypted-asset format:
$ kc encrypt-message 'this is another secret message' bob
did:test:z3v8AuacNPvBNSN8o1LgJxSD9jZVQBkre8BfHdrPgSugb7zuhqs
Decrypting a message or file
The intended recipient, or the sender when a sender copy was stored, can decrypt the asset:
$ kc decrypt-did did:test:z3v8AuacNPvBNSN8o1LgJxSD9jZVQBkre8BfHdrPgSugb7zuhqs
this is another secret message
Decrypting JSON
Use decrypt-json when the plaintext is JSON, such as a verifiable credential:
$ kc decrypt-json charlie-homepage
{
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"type": [
"VerifiableCredential",
"did:test:z3v8AuahM2jN3QRaQ5ZWTmzje9HoNdikuAyNjsGfunGfLCGj87J"
],
"issuer": "did:test:z3v8AuagsGQwffFd2oVhkdcTWRBi2ps5FdRAJD4jzEVMszkYBCj",
"validFrom": "2024-03-13T20:18:13.290Z",
"validUntil": null,
"credentialSubject": {
"id": "did:test:z3v8AuagsGQwffFd2oVhkdcTWRBi2ps5FdRAJD4jzEVMszkYBCj"
},
"credential": {
"account": "https://charliehebdo.fr/",
"service": "homepage"
},
"signature": {
"signer": "did:test:z3v8AuagsGQwffFd2oVhkdcTWRBi2ps5FdRAJD4jzEVMszkYBCj",
"signed": "2024-03-13T21:01:15.922Z",
"hash": "da5837c59a2a30a0235668ba8d472dcfc10221a0f01d1d2c9e265ff13436e036",
"value": "861af32e15e961853b1e84543635249a5f89f22f9360293c05be3a84b53724a934d4e5fc7c6901f503e3df72cb653efa76e8f565dca5c07c7fc9437c95d4355f"
}
}
Anyone without the required wallet keys sees only the encrypted asset returned by resolve-did.