Skip to content

Instantly share code, notes, and snippets.

@strawstack
Created November 22, 2023 17:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save strawstack/76ee40209e8bab2a3b3d3571328a98cf to your computer and use it in GitHub Desktop.
Save strawstack/76ee40209e8bab2a3b3d3571328a98cf to your computer and use it in GitHub Desktop.
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js" integrity="sha512-a+SUDuwNzXDvz4XrIcXHuCf089/iJAoN4lmrXJg18XnduKK6YlDHNRalv4yd1N40OKI80tFidF+rqTFKGPoWFQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<script>
function rollDice() {
return (Math.floor(Math.random() * 6) + 1).toString();
}
function getSecret() {
const lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const secret = [];
for (let i = 0; i < 30; i++) {
secret.push(
lookup[Math.floor(Math.random() * lookup.length)]
);
}
return secret.join("");
}
function encrypt(number, secret) {
return CryptoJS.AES.encrypt(number, secret);
}
function decrypt(message, secret) {
return CryptoJS.AES.decrypt(message, secret);
}
// Only dm can access dm values
const dm = {};
// DM Calculate offset value
dm.offset = rollDice();
// DM generate secret
dm.secret = getSecret();
// DM encrypt offset value
dm.encrypted_offset = encrypt(dm.offset, dm.secret);
// Only player can access player values
const player = {};
// Player stores copy of dm encyptyed offset
player.encrypted_dm_offset = dm.encrypted_offset;
// Player rolls dice
player.offset = rollDice();
// DM stores copy of player roll
dm.player_offset = player.offset;
//
// Once player receives secret, both parties decrypt and compare answer
//
// Player stores dm secret
player.secret = dm.secret;
// Player calculated roll
const offset = decrypt(player.encrypted_dm_offset, player.secret);
player.roll = ((offset + player.offset) % 6) + 1;
// DM calculated roll
dm.roll = ((dm.offset + dm.player_offset) % 6) + 1;
console.log(
`dm: ${dm.roll}\nplayer: ${player.roll}`
);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment