You don't really have a cryptography problem. Ethereum authenticates the sender for you. I think the trick will be formulating who can do what.
Here's an example interpretation of your description as I understood it.
There are n states, known by a topic ID. I made them bools for simplicity.
There is an "owner" who controls who else is allowed to edit the state. You could even make this ownership transferable but I left it out for brevity.
The owner is allowed to grant to revoke user access rights.
Certain users with permission from the owner can update a state.
pragma solidity 0.4.25;
contract Conditions {
struct Topic {
bool state;
address owner;
mapping(address => bool) canChange;
}
mapping(bytes32 => Topic) public topics;
modifier onlyTopicOwner (bytes32 topic) {
require(msg.sender == topics[topic].owner);
_;
}
modifier onlyTopicTrustee (bytes32 topic) {
require(msg.sender == topics[topic].owner || userTopicPermission(topic, msg.sender));
_;
}
function isTopic(bytes32 topic) public view returns(bool) {
return(topics[topic].owner != address(0));
}
function userTopicPermission(bytes32 topic, address user) public view returns(bool) {
if(!isTopic(topic)) return false;
return topics[topic].canChange[user];
}
function createTopic(bytes32 topic, bool state) public {
require(!isTopic(topic));
Topic storage t = topics[topic];
t.state = state;
t.owner = msg.sender;
}
function changeUserAccess(bytes32 topic, address user, bool canChange) public onlyTopicOwner(topic) {
topics[topic].canChange[user] = canChange;
}
function changeTopicState(bytes32 topic, bool state) public onlyTopicTrustee(topic) {
topics[topic].state = state;
}
}
Hope it helps.